渲染优化既涉及 CPU 提交成本,也涉及 GPU 绘制成本。Draw Call 数量只是其中一个指标:一个绘制调用可能只画少量简单几何,也可能覆盖大量像素并执行昂贵的着色。本文以 Unity 6.0 文档为参考,具体行为需要结合渲染管线、着色器和平台确认。

先确认是提交成本还是绘制成本

CPU 侧会处理可见性、排序、材质状态和命令提交,GPU 侧会执行顶点、片元与其他图形工作。重复材质切换可能增加 CPU 成本;高分辨率、透明层叠、复杂着色器和阴影则可能增加 GPU 工作量。

使用 Profiler 与目标平台工具看时间,再用 Frame Debugger 观察绘制事件。重点检查哪些对象无法按预期组合、使用了哪些材质与 Pass,以及阴影或额外相机是否让场景被重复绘制。SetPass、批次数和帧时间应一起看,避免只追求一个数字变小。

SRP Batcher 优化的是 CPU 准备工作

SRP Batcher 为兼容的渲染管线和着色器提供更高效的绘制准备路径,减少材质数据和渲染状态处理的 CPU 成本。它尤其关注使用相同 Shader Variant 的材质,允许不同材质共享更高效的准备流程。

它不会把整场景的独立绘制自动变成一个 Draw Call。因此,启用 SRP Batcher 后,Draw Call 数量可能几乎不变,但 CPU 提交时间仍有改善。反过来,大量 Shader Variant 或不兼容的着色器,也会削弱它的效果。

MaterialPropertyBlock 与 SRP Batcher 的兼容性需要特别注意。它并非在任何渲染管线下都能免费改变属性:对于需要走 SRP Batcher 的对象,使用它可能导致无法走该优化路径。应在对应版本文档和 Frame Debugger 中核实。

GPU Instancing 适合重复网格与材质

GPU Instancing 可以通过一个绘制调用渲染多个使用相同网格和材质的实例。树木、石块和重复道具是常见候选对象,前提是着色器支持所需的实例化路径,并正确处理每个实例的数据。

开启材质上的实例化选项不代表所有对象都会自动合并。网格、材质、渲染条件和属性变化都可能影响结果。Unity 6.0 文档还说明,URP/HDRP 中传统 GPU Instancing 与 SRP Batcher 的选择有具体限制;应根据实际使用的 API 和管线确认,而不是全局关闭一个系统试图让另一个系统生效。

实例化也有收集与上传数据的成本,并不会减少实例本身需要执行的全部顶点或片元工作。如果瓶颈主要是透明重叠或昂贵的像素着色,减少 Draw Call 未必能解决问题。

按照场景选择并验证

主要问题优先尝试
CPU 材质准备成本高核实 SRP Batcher 兼容性,减少不必要的 Shader Variant。
重复网格与材质产生大量提交评估 GPU Instancing,并检查实际绘制事件。
远处几何仍很复杂评估 LOD、可见性与阴影距离。
透明效果覆盖大量屏幕区域降低重叠、分辨率或着色复杂度。

对于静态批处理,也要考虑合并数据占用的内存;对于动态批处理,要考虑 CPU 处理和条件限制。不同优化方法可能相互影响,不应把所有开关打开就视为完成。

参考资料

本文根据以下资料整理撰写,详细规范与版本行为请以原文为准。