元素更新方式 DrawCall合并规则 网格更新机制 堆内存分配
元素更新方式
& 对制作的影响(ps:改变缩放和颜色也算动态)
—“动态”元素尽量少用Outline、Tiled Sprite
—尽量减少“动态”长文本
NGUI的元素更新:
UIPanel.LateUpdate采用轮询的方式,每帧都会执行,并且每帧都会有UIPanel.UpdateWidgets这个函数的调用,做的事情就是对这些UI元素的位置、缩放等信息的获取,也就是即使没有变化的UI元素,也会有正常的轮询操作的开销。
UGUI的元素更新:
Canvas.SendWillRenderCanvas则不是通过轮询的方式,而是通过两个队列:m_LayoutRebuildQueue和m_GraphicRebuildQueue。这两个队列会分别记录Layout和外观(Graphic)发生变化的UI元素,在渲染之前,会在这个回调函数里去处理这两个队列里的元素,即分别进行Rebuild。 所以,在UGUI中如果有大量UI元素但是是静态的,则不会有持续开销。
对动态HUD缓存机制的影响(缓冲池)
-NGUI
*适量元素(比如血条就需要20、30个让它在池子中,不停出现消失的话)可直接通过Color.alpha = 0去隐藏。这样UI元素的顶点数可被移除掉,也可节省一部分SetActive的开销
*若有大量激活的UI元素在缓冲池中,开销较大,这时可以考虑二级缓存,在进入战斗的时候依旧可以通过上边的让a=0或1的方式去切换;但是当退出战斗后再让缓冲池里的元素按批的去SetActive(false)禁用掉,这样就可以保证出了战斗之后,这些缓冲池里的元素不会有持续的开销。
注意:尽量不用Scale = 0 ,这仅仅把网格Scale为0,但顶点数还在,DC依旧会提交!
-UGUI
*Scale = 0,或挂一个Alpha Group = 0,这两种均可去掉元素的顶点,且无SetActive这种额外开销。
注意:但尽量不用Color.alpha = 0这种把透明度设为0的方式,因为这相当于贴了一个透明面片还是会被画到场景中,对DC和OverDraw无影响。