Unity 中的 SetPass Call 和 Draw Call

SetPass Call 代表渲染状态切换,主要出现在材质不一致的时候,进行渲染状态切换。如果一个 Batch 和另一个 Batch 使用的不是同种材质或者同一个材质的不同 Pass,那么就要触发一次 SetPass Call 来重新设定渲染状态。例如,Unity 要渲染 20 个物体,这 20 个物体使用同种材质(但不一定 Mesh 等价),假设两次 Dynamic Batch 各自合批了 10 个物体,则对于这次渲染,SetPass Call 为 1 (只需要渲染一个材质),Batch 为 2。

Draw Call 严格意义上,CPU 每次调用图形 API 的渲染函数(使用 OpenGL 举例,是 glDrawElements 或者 DrawIndexedPrimitive)都算作一次 Draw Call,但是对于 Unity 而言,它可以多个 Draw Call 合并成一个 Batch 去渲染。

真正造成开销较大的地方,第一个在于在于切换渲染状态,第二在于整理和提交数据。在真正的实践过程当中,可以不用过于介意 Draw Call 这个数字(因为没有提交数据或者切换渲染状态的话,其实多来几个 Draw Call 没什么所谓),但是 SetPass Call 和 Batch 两个数字都要想办法降低。由于二者存在强相关性,那么通常降低一个,就一并可以降低第二个。

本文参考:https://zhuanlan.zhihu.com/p/76562300