Wiki
887 words
4 minutes
静态合批
Updated 2025-02-08
是什么
静态合批是典型的“空间换时间”方案。Unity 会把一组不会频繁移动的网格预先整理成更适合连续提交的批次,减少运行时的 draw 提交成本。
【重点】静态合批不会减少实际渲染的三角形数量,它减少的是 CPU 提交批次时的开销。
工作方式
在构建期或运行时,Unity 会把满足条件的对象整理进静态批次。合批后的几何数据会以更适合提交的形式缓存下来,但场景中的各个 Renderer 仍然可以单独做可见性判断。
这点和“在 DCC 软件里直接把网格焊死成一个大模型”不同:静态合批仍然保留逐对象剔除能力,所以通常比纯手工合并更灵活。
适用条件
- 物体在运行时基本不移动、不旋转、不缩放
- 共享材质或至少能按材质分成稳定批次
- 更适合建筑、地表、墙体、场景装饰等环境物件
- 如果是运行时生成内容,可以调用
StaticBatchingUtility.Combine手动合批
主要收益
- 运行时几乎不需要再为这些对象做动态合批整理
- 减少 CPU 侧 draw 提交与状态切换压力
- 每个 Renderer 仍可单独剔除,不至于像完全焊死网格那样把远处不可见部分也一起画出来
代价与限制
1. 额外内存
Unity 需要保存组合后的几何数据。如果多个对象复用同一份 Mesh,静态合批后往往会出现几何数据副本,内存占用会上升。
2. 不适合会动的对象
角色、可破坏物、频繁开关的机关、会被动画驱动的物体,都不适合依赖静态合批。
3. 批次本身也有限制
单个静态批次最多大约 64000 顶点,超过后 Unity 会自动拆成多个批次。因此它不是“整个场景只剩一个批”。
【注意】树林、碎石、海量装饰物这类“数量特别多且网格重复”的场景,未必优先选静态合批。它们常常更适合 GPU Instancing,否则内存代价会很明显。
构建期与运行时
- 构建期静态合批:最常见,适合稳定场景内容
- 运行时静态合批:适合程序生成的关卡或开局后不再变化的地图块,可用
StaticBatchingUtility.Combine
【例子】Roguelike 地图在房间拼装完成后,可以对本房间内不再变化的环境块做一次运行时静态合批。
与其他方案的区别
对比 动态合批
- 静态合批:用内存换运行时更低的 CPU 整理成本
- 动态合批:几乎不加内存,但每帧都要为合批付 CPU
对比 GPU Instancing
- 静态合批:更适合“不动但不一定完全相同”的环境物体
- GPU Instancing:更适合“同网格同材质但数量很多”的重复实例
实际判断方法
- 看
Profiler的Rendering模块里 batch 数是否下降。 - 同时检查内存是否被显著抬高,尤其是大场景和重复模型多的场景。
- 如果批次下降不明显,但内存涨很多,说明这批对象不值得做静态合批。
【技巧】静态合批最适合“稳定、可复用、材质相对统一”的环境层,而不是把所有物体一股脑勾成 Static。