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

来自为知笔记(Wiz)

时间: 2024-08-30 05:24:42

Disable掉NGUI的UIPanel会引起UISprite产生异常开销的相关文章

NGUI之UIPanel

原文:http://www.tasharen.com/forum/index.php?topic=6705.0 概述 UIPanel用来收集和管理它下面所有widget的组件.通过widget的geometry创建实际的draw call.没有panel所有东西都不能够被渲染出来.如果你对Unity熟悉,你可以把UIPanel当做Renderer. 所有panel都有一个Depth值,会影响所有它包含的widget.如果你的UI有很多窗口,那么最好每个窗口有一个panel.Panel上的dept

JBOSS 数据源配置并使用JNDI调用

场景分析: 某天系统的数据库维护方要求进行DG备库容灾演练,要把生产用RAC库模拟宕机并转移至DG备库上,由于是failover而不是switchover演练,于是期间不对外开放apache访问,要求服务启动时间较紧. 数据库的切换导致IP的变更,这样导致ap上正在跑的系统不得不重新配置数据库连接,基于目前的机制需要执行以下步骤: a).停止服务群组 b).移除服务包 c).源服务包替换配置文件(这样还要求服务包的当前版本备份完好) d).重新上传服务包 e).分发至群组,最后启动群组 f).当

unity3D游戏开发十八之NGUI动画

我们先来看下帧动画,顾名思义,就是一帧帧的图片组成的动画,我们须要用到UISprite Animation组件,它的属性例如以下: Framerate:播放速率,也就是每秒钟播放的帧数 Name Prefix:图片名字的前缀,能够用来过滤图片集中的图片,从而指定你须要的图片 Loop:循环 依照前面文章创建UI的步骤,我们创建一个sprite,一个button,通过点击button来控制动画的播放和暂停.OK,首先我们创建一个Atlas,把我们的须要的素材放进去,例如以下图: 点击Create创

Unity+NGUI性能优化方法总结

一共9招. 1 资源分离打包与加载 游戏中会有很多地方使用同一份资源.比如,有些界面会共用同一份字体.同一张图集,有些场景会共用同一张贴图,有些会怪物使用同一个Animator,等等.可以在制作游戏安装包时将这些公用资源从其它资源中分离出来,单独打包.比如若资源A和B都引用了资源C,则将C分离出来单独打一个bundle.在游戏运行时,如果要加载A,则先加载C:之后如果要加载B,因为C的实例已经在内存,所以只要直接加载B,让B指向C即可.如果打包时不将C从A和B分离出来,那么A的包里会有一份C,B

NGUI 2DCamera和3DCamera共存的解决方案

主要解决问题是面板里含有3D模型,如果只有1个正交相机,3D模型的显示质量会很差.如果只用透视相机,UI会变形 NGUI官方的例子是使用2个UI Root,再创建一个Camera,把模型渲染到面片上.但这样有点复杂,并且对于移动平台消耗过高,也不适合一个面板一个prefab的形式 测试了一阵子,现在我个人比较好的解决方法是:只使用一个UI Root,UIRoot层级下包含2个Camera,Camera2D和Camera3D.3D相机的渲染深度比2D相机低一级. 分别用NGUI,NGUI3D两个L

Unity3D游戏开发之【NGUI】grid下面的item的重复利用

解决的问题 使用grid放置item的时候,每次数据可能都不一样,但是每次都删除grid下面的节点,之后动态创建新的item是比较浪费的. 写个简单的工具函数,原理很简单. 1.先获得grid下面的可用item 2.根据data的大小进行初始化 3.每次在可用的item列表里面获取新的item,如果不够用了,就创建新的item 4.disable掉没用的item 附:每个grid下面预先要有一个名字包含"Template_"的模板item.这个模板不会被用,之前尝试过把这个模板也当做一

Unity NGUI和UGUI与模型、特效的层级关系

目录 1.介绍两大UI插件NGUI和UGUI 2.unity渲染顺序控制方式 3.NGUI的控制 4.UGUI的控制 5.模型深度的控制 6.粒子特效深度控制 7.NGUI与模型和粒子特效穿插层级管理 8.UGUI与模型和粒子特效穿插层级管理 写在前面 这篇笔记是整理了之前做的记录,在做项目的过程中,遇到了各种各样的界面穿插问题,界面层级混乱,比如,手机卡了或点快了,就导致两个界面相互交叉.对于界面,这应该算是一个很严重的bug,很大部分原因是整个UI框架没有从整体上考虑这个,后来决心弄清楚层级

NGUI中穿插粒子或者mesh渲染层级

在项目中由于特效的层级与NGUI UI的层级不太还规范,导致特效的渲染层级较为杂乱于是就想把特效层级与NGUI的层级管理混合在一起: 在修改之前首先要了解NGUI的层级管理以及DC的合并: 在NGUI中层级的管理以及Drawcall的合并都是由UIPanel这个组件来完成的:在NGUI中UIpanel就相当于UGUI中canvas和canvasrender,在UIpanel中会维护两个队列分别是UIWidget和UIDrawcall的队列并按照深度排序: 每当该UIPanel下有UIWidget

【小松教你手游开发】【unity实用技能】NGUI Depth探索

首先做个测试项目 每个子节点节点的东西基本是一样的 这里的TestDepth脚本只做一件事 获取RenderQueue.输出. 不过在每个父节点上有个UIPanel. 通过设置不同UIPanel和不同UISprite的Depth值来测试NGUI是怎么区分深度的. 通过脚本输出RanderQueue可以看到 看最后的数字. 以前我以为是按一定系数相乘再相加. 其实是根据UIPanel的个数排序.排最先的UIPanel的第一个UIWidget从3000开始. 根据同一个UIPanel下的UIWidg