渲染的细节
牢牢记住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