动态合批 | 静态合批 | Gpu Instancing | SRP Batch |
使用样例 | 动态生成的同材质多条闪电Mesh | 场景中不会在运行时进行修改的、勾选Static的静态建筑 | 草地 |
原理 | 将所有生效对象顶点在CPU中转换为世界空间 | 将所有生效对象转换为世界空间,共享顶点与索引缓冲区 | 只提交一个mesh和材质,但是提交多个实例的差异化信息,对同一个mesh在GPU进行变换绘制 |
生效要求 | 若干材质实例相同的动态对象 | 静态对象(不会旋转移动或者缩放),具有相同的顶点属性 | 同Mesh同材质对象 | 所有Shader支持的对象 |
合批上限(单批) | 不超过900个顶点属性(float4)且不超过300个verts | 64k vertices和64k indices(OpenGLES为48k indices,macOS为32k indices) | 1024个对象 | 无 |
Draw call变化 | ↓ | - | ↓↓ | - |
打断原因 | 1. 包含镜像(scale出现负值)
2. 使用不同材质实例3.存在光照贴图额外属性,比如光照贴图索引和缩放4. 延迟渲染或多pass前向渲染 | 1. 状态修改(材质/坐标等信息)
2. 包含镜像(scale出现负值) | 穿插遮挡(比如在两个可供Instancing的Opaque物体A和B中插入一个需要判定遮挡的Opaque物体C) | 材质参数修改(MaterialPropertyBlock也不行) |
弱点 | 生效要求多 | 1. 需要对对象勾选Static Flag
2. 占用更多内存(相同对象不同引用会在运行时创建不同的副本)3. 项目设置中如果开启了Mesh优化,Unity会在构建生效对象的顶点缓冲区时删除所有未被任何着色器变体使用的顶点数据 | 生效要求多 | 1. 优化提升不明显
2. 在实际项目调试中会影响Frame Debugger内渲染条目的查看 |