DrawCall 与实例化合批
DrawCall(绘制调用)是渲染性能的通用货币。理解它的成本与合并手段,是渲染优化的基本功。
DrawCall 的成本
每次 DrawCall = CPU 准备命令 + GPU 状态切换:
- CPU 侧开销固定(命令准备),DrawCall 数量多 = 渲染线程累;
- GPU 侧的状态切换(shader / 纹理 / target)才是真贵——合批的本质是减少状态切换。
常见 DrawCall 消耗者
| 消耗者 | 量级直觉 | 合批手段 |
|---|---|---|
| 静态网格(数千实例) | 数百 DC | ISM / HISM(1 个 DC) |
| 草 / 树 | 上千 | ISM / Foliage 工具 |
| 特效 Sprite | 每个 Emitter 一个 DC 起 | 合并发射器 |
| 角色 + 附属物 | 每个 mesh 一个 DC | 减少附属 / 合并网格 |
| UI(UMG) | 一层一个好几个 | 合并图集 / 少用独立材质 |
| 材质不同的同一物体 | 每材质一个 DC | 材质合并(同一材质的网格才能合 DC) |
合批的三条铁律
- 同材质才能合 DC:两种材质的两个 DC 无法合并(除非用材质 ID 数组 / 多材质槽);
- 实例化(ISM)适合大量相同网格:实例的位置存在 GPU 缓冲,一次 DC 画全部;
- 合批 vs 精确剔除的取舍:ISM 把 500 棵树合成 1 个 DC,但也意味着视锥剔除只能整组做——树是"远处场景"的时候合批赢,是"围绕镜头"的时候要分组 HISM。
检查 DrawCall 的方法
stat scenerendering:看 DrawCall 数与图元数;- 视图模式:编辑器视口 → Buffer Visualization / 或控制台
r.ShowDrawCalls类开关可能有版本差异,最稳的是 stat; - Insights 的渲染轨道:每个 DC 的提交时间。
