UGUI优化(四)Canvas动静分离

原因
UGUI优化DrawCall最主要的手段就是动态合批。而Unity在做合批的时候是以Canvas为根节点,计算所有UI顶点数据生成一张大的Mesh,在它的下面又会根据Atlas、渲染顺序的不同把能合批的都生成一张小的Mesh,这样每张小Mesh就是一个DrawCall。

而当Canvas下面的UI元素发生变化时,UGUI就要对这个Canvas重新计算生成一次Mesh,体现在Profiler中则是Canvas.SendWillRenderCanvases()与Canvas.BuildBatch()的耗时升高。Canvas.SendWillRenderCanvases()主要是计算Canvas下面所有的顶点数据,Canvas.BuildBatch()则是负责进行Mesh绘制与合批。
UGUI优化(四)Canvas动静分离_第1张图片

官方优化
不过好在Unity5.2之后,Canvas.BuildBatch()合批已经放在子线程中去执行,大大缓解了主线程压力。但是相应的优化还是有必要去做的。

优化
既然Canvas.SendWillRenderCanvases()是由Canvas下的UI顶点变化而引起重新计算引起的,那么优化就可以从两个方便着手:减少Canvas下的顶点数量、减少重新计算的顶点数量

1)减少Canvas下的顶点数量
UGUI中产生顶点信息最要的两个基础组件就是Image和Text,所以我们的优化也从这两者着手。

Image:顶点数量取决于Image Type的选择
①Simple 4 个顶点;
②Sliced 勾选FillCenter的顶点数是 36 个,不勾选是 32 个;
③Tiled 取决于Rectranform 设置的大小和原图大小,铺开了 N 张图就是 4*N 个;
④Filled 选择比较多,但最少也有4个。
所以对于Image首选Simple模式其次则是Sliced模式且不勾选FillCenter。

Text:一个字符4个顶点
Text是UGUI产生顶点数量的重灾区,一个字符产生4个顶点,如果再加上Shadow则相当于又把Text复制了一遍产生8个,Outline则会将Text复制4遍产生20个顶点。所以Shadow、Outline不但会产生额外的OverDraw外还会产生过多的顶点数,一定慎用,确实需要请选择用图片背景替代,其次选择相对较省的Shadow。

2)减少重新计算的顶点数量
一个Canvas下的数量是一定的,怎样才能减少呢?UI顶点的变化通常是由组件本身的enable属性、color的变化、transform的变化等引起。产生这种变化的UI我们是可以提前预知的,而且Canvas.SendWillRenderCanvases()与Canvas.BuildBatch()的计算是以Canvas为根节点进行的,所以我们可以将会发生变化的UI单独放在一个Canvas下面,称为动态Canvas;不会发生变化的UI放在 一个Canvas下面,称为静态Canvas,做到动静分离。这样只需要计算动态Canvas即可,大大减少顶点计算数量。

但要注意的一点Canvas与Canvas不能合批,我们分离的Canvas越多带来的DrawCall也会响应增加,所以怎么分离Canvas、分离多少个Canvas就需要在项目中自行取舍。

你可能感兴趣的:(UGUI优化,Unity,UGUI,动态合批,游戏优化,动静分离)