DrawCall是CPU调用图像编程接口,命令GPU进行渲染的操作。造成DrawCall过高的性能瓶颈其实是CPU而不是GPU。UGUI的合并原理是将相同的材质进行合并操作。因此UGUI减少DrawCall的方式是尽可能地进行动态合批。
2.DrawCall的计算原理2.1.计算Depth
(1)跳过不渲染的节点,如果处于渲染状态切没有任何其他相交的渲染元素,depth=0。
(2)如果处于渲染状态切有其他元素相交则找到相交元素中最大的depth,判断能不能合批,如果能合批则depth=maxDepth,否则depth=maxDepth+1。
(3)depth与是否相交有关,与是否为子节点无关。
2.2.材质球
计算出depth后,针对depth相同的情况下,获得材质球的Instance ID进行升序排列
2.3.纹理
再获得纹理的Instance ID进行升序排列
(1)使用图集SpriteAtlas则Instance ID为图集的ID
(2)单个图片没有图集Instance ID为图片的ID
(3)一个字体的Text,Instance ID为字体的ID
2.4.总结
所以DrawCall的计算就是上面3点从上到下的优先级顺序进行升序排列,只有满足3点相同GUI才能进行合批操作,算为一个DrawCall。
3.Rebuild概念Canvas负责将子节点的UI元素的网格合并,并生成相应的渲染指令再发送到Unity的图形管道的过程。所以Canvas就是渲染UI的组件,当UI发生变化就要执行一次Batch,它是影响性能更大的元凶。注意Canvas的Batch只会影响其子节点,但不会影响其子Canvas。
4.Rebuild操作Rebuild分为Layout Rebuilds和Graphic Rebuild
4.1.Layout Rebuilds
重新计算一个layout组件的子节点的适当位置或者大小的时候触发
4.2.Graphic Rebuilds
graphic元素基本大小,旋转以及文字变化、图片的修改等触发
4.3.总结
Layout Rebuilds和Graphic Rebuilds都会触发Rebuild,UGUI会收集一帧的所有change,然后统一进行处理。



