Wiki
735 words
4 minutes
动态合批
Updated 2025-02-08
是什么
动态合批会在 CPU 侧把多个小网格临时整理到同一批提交数据里,再以更少的批次提交给 GPU,从而减少批次数和状态切换。
【重点】它优化的是“提交成本”,不是让 GPU 少画东西。顶点还是那些顶点,只是 Unity 尝试把本来分散的小对象合并提交。
适用条件
动态合批只有在对象足够“小且像”的时候才值得做,常见条件包括:
- 共享同一个材质实例和相同的 Shader Pass
- 顶点属性总量不超过 900,顶点数通常不超过 300
- 顶点属性越多,可参与合批的顶点上限越低
- 带镜像的缩放、额外材质差异等因素都可能打断合批
【例子】如果 Shader 只使用 Position、Normal、UV0,通常还能容纳约 300 顶点;如果再加 UV1 和 Tangent,可合批的顶点数会进一步下降。
CPU 开销来自哪里
动态合批不是“白送”的,主要成本在:
- 每帧把对象顶点转换到合适的提交空间
- 重新组织批次数据
- 在 CPU 侧维护可合批对象的排序与提交
所以当项目已经是 CPU 瓶颈时,动态合批不一定带来净收益,甚至可能更慢。
什么时候更适合开启
- 小型重复物体很多,例如简单场景摆件、低面数道具
- GPU 不是主要瓶颈,反而是渲染提交成本偏高
- 目标设备偏旧,单次 draw 提交成本仍然明显
什么时候要谨慎
- 网格顶点并不小,CPU 为了合批付出的整理成本过高
- Shader 顶点属性复杂,能合进去的对象本来就很少
- 已经有更合适的手段,例如静态场景用 静态合批,大量相同网格用 GPU Instancing
- 现代低开销图形 API 或高端设备上,动态合批的收益往往不稳定,更需要真机验证
与其他方案的区别
对比 静态合批
- 动态合批:节省批次,但每帧要做 CPU 侧整理
- 静态合批:更适合不动的环境物件,用额外内存换更低提交成本
对比 GPU Instancing
- 动态合批:把不同对象的数据重新拼起来
- GPU Instancing:同一网格、同一材质的多实例复用一套几何数据,更适合大量重复模型
实际判断方法
- 在
Profiler的Rendering模块里看Batches是否下降。 - 同时观察主线程和渲染线程时间有没有真正变好。
- 如果批次数下降了但 CPU 时间没降,说明合批带来的 CPU 整理成本把收益吃掉了。
【注意】不要因为“批次数更低”就默认更优。性能优化看的是帧时间,不是某一个指标单独变漂亮。