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)

合批的三条铁律

  1. 同材质才能合 DC:两种材质的两个 DC 无法合并(除非用材质 ID 数组 / 多材质槽);
  2. 实例化(ISM)适合大量相同网格:实例的位置存在 GPU 缓冲,一次 DC 画全部;
  3. 合批 vs 精确剔除的取舍:ISM 把 500 棵树合成 1 个 DC,但也意味着视锥剔除只能整组做——树是"远处场景"的时候合批赢,是"围绕镜头"的时候要分组 HISM。

检查 DrawCall 的方法

  • stat scenerendering:看 DrawCall 数与图元数;
  • 视图模式:编辑器视口 → Buffer Visualization / 或控制台 r.ShowDrawCalls 类开关可能有版本差异,最稳的是 stat;
  • Insights 的渲染轨道:每个 DC 的提交时间。