原因:
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绘制与合批。
官方优化:
不过好在Unity5.2之后,Canvas.BuildBatch()合批已经放在子线程中去执行,大大缓解了主线程压力。但是相应的优化还是有必要去做的。
优化:
既然Canvas.SendWillRenderCanvases()是由Canvas下的UI顶点变化而引起重新计算引起的,那么优化就可以从两个方便着手:减少Canvas下的顶点数量、减少重新计算的顶点数量。
1)减少Canvas下的顶