一、合批规则
合批:把渲染时使用相同材质、相同贴图的网格合并在一起,成为一个大网格,然后再调用一次Draw Call,直接渲染这一个大网格。这样做可以降低Draw Call的数量,以优化性能。
Unity是如何确定哪些网格可以进行合批的呢?
- 首先,合批是以Canvas为单位进行的。也就是说在不同Canvas下的UI元素是无法合批的。
- 接下来需要计算Canvas下所有UI元素的深度值。深度值计算规则如下:
- 如果当前UI元素不进行渲染,则Depth = -1
- 如果当前UI元素没有其他UI元素与其相交,则Depth = 0
- 如果当前UI元素与其他UI元素相交,则判断它们能否进行合批(Material ID、Texture ID是否相等),如果满足合批的条件,则它们的Depth相同;如果不满足合批条件,则取下方UI的最大深度值,并在其基础上+1。
- 计算完深度值后,按照「深度值->Material ID->Texture ID->Renderer Order(Hierarchy面板上的顺序)」对UI元素进行排序,剔除深度值为-1的元素,形成一个队列。
- 根据得到的队列,判断相邻元素之间的材质和贴图是否相同,只要相同就可以进行合批。注意这里不会对深度值进行判断,即使相邻元素深度值不同,只要满足上述条件也可以进行合批。
下面我们通过一个具体的示例加深理解

在上图中,白色Image位于所有UI元素的最底层,所以Depth = 0。接下来的文本位于白色Image的上层,所以Depth = 1。这里需要注意,UI元素进行深度判断是通过网格进行的,而不是通过rect。

本文详细解析Unity中UI合批的工作原理及其优化方法,包括如何通过调整UI元素属性来减少DrawCall,以及Mask与RectMask2D组件对合批的影响。
最低0.47元/天 解锁文章
1948

被折叠的 条评论
为什么被折叠?



