Dynamic Graphics
August 15, 2022About 2 min
Dynamic Graphics
Dynamic Batching
Dynamic Batching 是 Unity 的一种 CPU 端合批策略:引擎在每帧运行时将满足条件的多个小 Mesh 合并成一次 Draw Call,以减少 CPU 与 GPU 之间的提交次数。
顶点数量限制
- 默认限制:单个 Mesh 不超过 300 个顶点(使用顶点属性时限制更低,例如带法线 + UV 时约 180 个顶点)。
- 超出限制的 Mesh 不会被动态合批,需考虑其他方案。
开启方式
在 Project Settings → Player → Other Settings → Dynamic Batching 中勾选即可。对于使用 URP/HDRP 的项目,也可在 Render Pipeline Asset 中控制。
与其他合批方案的对比
| 方案 | 适用场景 | CPU 开销 | GPU 开销 |
|---|---|---|---|
| Dynamic Batching | 顶点少、共享材质的动态物体 | 中(每帧合并 Mesh) | 低 |
| Static Batching | 不移动的静态物体 | 低(构建时合并) | 低,但内存占用增加 |
| GPU Instancing | 大量相同 Mesh 的物体(如草、石头) | 极低 | 低 |
| SRP Batcher | URP/HDRP 下共享 Shader Variant 的物体 | 低(减少 SetPass) | 低 |
何时选用 Dynamic Batching
动态合批在以下条件同时满足时效果最好:
- 场景中有许多顶点数少的动态小物体(粒子、UI 元素、简单道具)。
- 这些物体共享同一个 Material 实例(含相同贴图和 Shader 参数)。
- 项目使用的是 Built-in Render Pipeline(URP/HDRP 下 SRP Batcher 通常更优先且效率更高)。
CPU 成本权衡
Dynamic Batching 并非免费:
- 每帧都需要在 CPU 侧将多个 Mesh 的顶点变换到世界空间后拷贝合并,顶点越多、物体越多,CPU 开销越大。
- 当物体数量很多但每个 Mesh 顶点并不少时,合批带来的 Draw Call 节省可能不足以抵消 CPU 合并开销,反而拖慢帧率。
- 在 URP/HDRP 项目中,SRP Batcher 通过缓存 per-object 常量缓冲区来降低 SetPass 调用,通常比 Dynamic Batching 更高效,且没有顶点数限制;GPU Instancing 对大量同 Mesh 物体的批量渲染更合适。
调试与验证
使用 Frame Debugger(Window → Analysis → Frame Debugger)可以直观看到哪些 Draw Call 被合并、哪些未被合并及原因。Profiler 中的 Rendering 模块也会显示 Batches 和 SetPass Calls 的数量变化,可以用来量化合批效果。