Wiki
887 words
4 minutes
静态合批

是什么#

静态合批是典型的“空间换时间”方案。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:更适合“同网格同材质但数量很多”的重复实例

实际判断方法#

  1. ProfilerRendering 模块里 batch 数是否下降。
  2. 同时检查内存是否被显著抬高,尤其是大场景和重复模型多的场景。
  3. 如果批次下降不明显,但内存涨很多,说明这批对象不值得做静态合批。

【技巧】静态合批最适合“稳定、可复用、材质相对统一”的环境层,而不是把所有物体一股脑勾成 Static。

静态合批
https://fuwari.vercel.app/wiki/performance/static-batching/
Author
Qingswe
Published at
2025-02-08
License
CC BY-NC-SA 4.0