参考文档:1. BatchBatchBatch.PDF
参考文档:2. DrawCall,Batches,SetPass calls是什么?原理?【匠】
DrawCall (绘制调用) 是什么
DrawCall就是CPU调用图像编程接口,比如 DirectX 的 DrawPrimitive/DrawIndexedPrimitive ,OpenGL 的 glDrawElement/glDrawArrays,以命令 GPU 进行渲染的操作
简单来讲,就是指 CPU 向 GPU 发送一条指令,用于进行渲染操作。即:DrawCall 就是一次渲染指令调用
Batches (批处理)又是什么
把数据加载到显存,设置渲染状态及数据,CPU 调用 DrawCall 的这一整个过程就是一个 Batch。
这个过程当中主要性能消耗点在于上传物体数据(加载到显存)和设置渲染状态及数据这一块,而不是DrawCall命令本身。
所以我们将多个 DrawCall 合并为一个 DrawCall 来减少调用DrawCall的开销(主要是调用DrawCall之前的一系列设置)
这个操作就是 Batches 批处理。
什么会造成DrawCall增加
1.无法合批/打断合批
1.Batch Breaker: Texture Change
纹理的更改会造成合批被打断,即:会增加 Batches 的数量,而 Sprite 的更改不会。
解决方法:若要降低 DrawCall ,可使用打包图集的方法。
RawImage 的图片更换则一定会打断合批。
2.Batch Breaker: Transform Change
位置、旋转、缩放、等空间变化的更改会打断合批。
解决方法:在 UGUI 的使用中进行动静分离,以减少 UI 重绘,降低 DrawCall
3.Batch Breaker: Material Change
不同材质的物体也没办法进行合批,会造成合批被打断
解决方法:1.使用材质图集将多个纹理合并为一个纹理,以便多个对象可以使用同一个材质,从而实现合批。
2.使用 Material Property Blocks 进行材质的动态属性修改
示例:
// 获取材质实例
Material instanceMaterial = renderer.material;// 使用 Material Property Blocks
MaterialPropertyBlock propertyBlock = new MaterialPropertyBlock();
propertyBlock.SetColor("_Color", Color.red); // 修改颜色
renderer.SetPropertyBlock(propertyBlock);
2.透明物体
对于透明物体而言,透明物体必须按照特定的顺序进行渲染,通常是从后到前。这是因为透明物体的混合效果依赖于其后面的物体的渲染结果。因此,透明物体的渲染顺序要求额外的处理