Disable掉NGUI的UIPanel会引起UISprite产生异常开销
摘要
5月27日发现机库界面在设备上有明显卡顿的情况,检查后发现UISpirte.Update有异常的性能开销,下图所示:
影响范围
为了Profile,在UISprite.Update中加入了如下Profile代码
结果如下:
结论:
的确有的界面在每帧把mChanged设置为true!,而且这部分是性能的罪魁祸首
Deactivate掉AcheivementUI(Clone)后
Deactivate掉QuestPanelMoveRoot后
剩余的开销大的UISprite基本就散落在UI各处了——Chat、CountDownPanel
原因
造成性能开销大是因为场景中有大量的UISprite组建的Update进入了if的上面这个分支,而这个分支有运算顶点位置等大量数据
进入这个分支的原因是mChange为true,这个mChanged本意是标记哪些控件移动过或者执行过任何需要更新表现的操作。
但是进行测试时,画面中没有任何移动中的UI控件,AchievementUI甚至都没有显示。。。(其实造成性能问题的原因就是因为没显示,见后文分析)
将mChanged设置为false的唯一方法是(下面是调用栈):
- UIWidget.UpdateGeometry()
- UIPanel.LateUpdate()
而AchievementUI的UIPanel是被disable的,所以UIPanel.LateUpdate永远不会被调用,mChanged就永远不会被设置为false,所以UISprite.Update就一直会执行开销大的上面的条件分支
结论
性能问题是由于Achievement、Quest和其他部分的UI控件只Disable了UIPanel,但是没有Deativate掉GameObject。
这种做法的确和官方范例中给出的隐藏方式不符,现在可以确定如果不按照NGUI官方建议的方法隐藏界面,就会引起上述性能问题。
posted on 2015-06-07 14:38 MobileFish 阅读(349) 评论(0) 编辑 收藏 举报