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编辑  收藏  举报

导航