码迷,mamicode.com
首页 > 其他好文 > 详细

Disable掉NGUI的UIPanel会引起UISprite产生异常开销

时间:2015-06-07 15:49:06      阅读:987      评论:0      收藏:0      [点我收藏+]

标签:


摘要

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官方建议的方法隐藏界面,就会引起上述性能问题。
 
 





Disable掉NGUI的UIPanel会引起UISprite产生异常开销

标签:

原文地址:http://www.cnblogs.com/mobilefishstudio/p/4558445.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!