【DrawCall】 unity 动态合批被打断的规律总结

一。动态合批经常被打断,原因有很多种,最常见的情况有两种:

1. 由于使用了 不同的材质 而导致不能合批,这种很容易理解;

2. 由于 层级关系被打断 ( 中间掺杂了 文字或其它图集的图片 ),导致即使是同一个图集里的UI,也会分成两批去渲染。

第二种是比较难控制的,因为UI层级关系往往比较复杂;

其它容易出现的原因:

1.  scale 不同 的物体一般不能合批(所以能通过 Rotation 和 Height / Width 解决的问题,尽量不要用 scale 来解决);

2.  顶点数过多,导致不能合批;(什么是顶点数? 可不是像素数哦~)

3. 材质虽然相同,但相关渲染参数设置却不同,也会打断合批;

4. 多 Pass 的 Shader 会中断 合批;

5. 不同的 Canvas 下的物体是不会被合批处理的;

6.

二。研究一下 层级关系打断合批的规律(先研究2D平面,所有的 PosZ 都是 0):

 这个规律跟逻辑层级(父子关系)没有任何关系,只跟 遮挡顺序 位置 有关系!

假如有 A、B 两个 Image ,处在 同一个Canvas 下,而且图片来自同一个图集。那么,在没有其它干扰的情况下,它们应该是动态合批的,不论AB是否有重叠的部分。此时只有一个DrawCall。后来,如果又新建了一个文本 T,不论 A、B、T 的父子层级关系是怎样的

1. 如果 T 覆盖或部分覆盖 在 A 的上面(即遮挡或部分遮挡了 A),图片 B 又 遮挡或部分遮挡了 T,那么现在的渲染顺序是:先渲染 A,再渲染 T,最后渲染 B。这样就变成 3 个DrawCall了。

2. 如果 后来你把 T 拉到一个 很遥远 的位置,即虽然 T 有能力盖住 A,但是它够不着,最终还是没有遮挡 A 的任何一个像素,此时的渲染顺序是:AB一起渲染,最后渲染 T。即有 2个DrawCall。不论 B 是否覆盖了 A都无所谓,因为相同图集的UI互相遮挡是不会打断合批的。

3. 如果 T 遮挡了 A,但是 B 没有遮挡 T,那么就不会打断合批,即 AB 一起渲染,再渲染T, 2个DrawCall。

4.  如果把 文本 T 改为 一个 Image ,这个 Image 的sprite 来自另外一个不同的图集,那么它同样遵从 上述两条规律,完全没有任何区别。

5. 以上所说的 覆盖或遮挡,是指的 眼睛能看到的遮挡,而不是逻辑上的遮挡,举个例子:

如果 文本 T 是 overFlow 的,它的 逻辑边界 很小,没有 和 B 接壤,但是 其文本却很长,溢出了逻辑边界,那么实际眼睛看到的是 和情景1 完全相同的模样。此时还是打断了动态合批,有3个DrawCall,等同于 情形1。

反之同理: 如果文本 T 的逻辑边界很长,但是里面的文字很短,逻辑边界 与 B 接壤了,但是眼睛看不出来,此时等同于情景3,合批没有被打断,有两个DrawCall。

00

原文地址:https://www.cnblogs.com/rollingyouandme/p/14085751.html