Unity-UI

渲染的细节

牢牢记住Canvas绘制几何图元的顺序是按照透明队列进行的。也就是说,Unity UI产生的几何图元都是按照从后向前使用alpha混合进行绘制

优化注意

  • CanvasGroup控制显隐,而非销毁或者SetActive
  • 并非相同材质和图片就会合批,如果中间插入别的UI元素可能会打断合批 (和一下第二点同?)
  • Canvas动静分离?

重要 --连续点击复杂重叠的mask

  • 同一图集的Image元素应尽量保证在Hierarchy中连续,避免中间插入其他图集,或插入文本。
  • 避免图片叠加在一起(遮挡,旋转)
  • 透明Image,用来做响应点击事件,同样存在开销
  • 不要勾选Raycasts,如果不需要
  • 避免或减少Mask的使用,1个Mask至少增加两个DC
  • 避免频繁动态的更新UI元素的Vertex, Rect, Color, Material,
  • 避免UI元素数目过多和层次结构过于复杂影响Batch更新速度。
  • 使用缓存池,对缓存频繁使用的元素。
  • 固定的Text考虑与背景图层合在一张图上(可能不便本地化,但可以减少drawcall)。

次重要

  • 降低界面的更新频率
  • 避免图集分离,使用相同的图集。
  • 如果sprite是中心镂空且切图为九宫格时,可以去除fill center,以减少over draw
  • 避免频繁删除/增加UI对象,UI层次结构变化会引起Canvas的更新Texture等,可能引起Canvas数据更新和Batch更新计算,有可能引起VBO Update(重新提交顶点数据)。
  • 尽可能使用少的UI Material和贴图(使用图集),使得可以Batching。
  • 同一父节点下所有子节点,保持相同的层次结构(如List控件下的item),便于底层相同depth下UI元素Batch。

重建(rebuild)过程(Graphics)

总体

重建过程是指Unity UI的C# Graphic组件的 layout和mesh重新计算的过程

重合批 ReBatching

1,首先第一步要根据深度关系进行排序,如果一个canvas底下的层级关系非常复杂,它的排序的性能消耗呈非线性的增长。
2,另外一个就是覆盖关系,在UI里面,其实像我刚才提到的,我们需要尽量避免UI的重叠。举个简单的例子,如果我们有两个Button,它们重叠的话,它是多少的消耗呢?这就是一个覆盖关系。
3,然后就是一个材质,材质在一开始接触Unity引擎的时候都会听说过静态合批和动态合批。其实原理是一样的,我们能够合到一个批次里面,他们的材质必须是一样的,就是UI组件。

ReBatching是多线程的

rebatching的过程当中还有一点需要注意,它是多线程的

ReBuild

主要是布局的重新build还有图形学的Graphic 的rebuild
(比如说我们常用的属性,有位置,颜色,都会影响到Graphic的重建)

Canvas

canvas其实在UGUI里面重要的作用就是生成UI组件,然后生成command命令,然后传递到GPU,最后由GPU把它们画出来
就是避免出现中间层 (中间层的意思就是说我某一个UI组件和它周围的UI组件都不在一个批次里)

重建 是UGUI优化的关键 -- Unite2017嘉宾杨怀忠分享《UGUI深度优化》
https://www.jianshu.com/p/dc9f83f8e818
https://www.cnblogs.com/zhaoqingqing/p/9658403.html
optimizing-unity-ui

原文地址:https://www.cnblogs.com/Jaysonhome/p/13675697.html