【性能优化】Unity 渲染优化全解析:Draw Call、Batch、SetPass 与批处理技术
Unity 渲染优化全解析:Draw Call、Batch、SetPass 与批处理技术
在 Unity 开发中,性能优化是保证游戏流畅的核心环节。尤其在移动端或 VR/AR 场景,Draw Call 过多、材质切换频繁都会严重影响帧率。
本文将从 Unity Statistics 面板参数解析入手,深入讲解 Dynamic Batching、Static Batching 与 GPU Instancing,并提供实用优化策略和排查方法,帮助开发者快速提升渲染性能。
文章目录
- Unity 渲染优化全解析:Draw Call、Batch、SetPass 与批处理技术
- 一、Unity Statistics 参数解析
- 核心参数说明
- 1.1 Dynamic Batching(动态批处理)
- 1.2 Static Batching(静态批处理)
- 1.3 GPU Instancing(GPU 实例化)
- 二、Unity Draw Call 优化策略
- 三、Unity 各批处理功能启用方法
- 3.1 Dynamic Batching
- 3.2 Static Batching
- 3.3 GPU Instancing
- 四、总结
一、Unity Statistics 参数解析
在 Unity 中,打开 Ctrl+7(Profiler) 或者 Stats 面板,可以看到场景渲染的核心指标:
核心参数说明
参数 | 含义 |
---|---|
SetPass Calls | 材质切换次数,每次切换都会触发 GPU 管线状态更新,CPU 开销较大 |
Draw Calls | 实际提交给 GPU 的绘制调用次数 |
Batches | Unity 优化后的批处理数量(经过 Dynamic/Static Batching 或 Instancing) |
Triangles | 场景中三角形总数 |
Vertices | 顶点总数 |
Tips:
Batches
通常小于Draw Calls
,说明 Unity 已经对部分对象进行了批处理优化。
1.1 Dynamic Batching(动态批处理)
-
作用:将小型可移动 Mesh 合并成一个 Draw Call。
-
要求:
- 顶点数 ≤ 300
- 相同材质
- 对象可移动(非 Static)
- Shader 支持 Dynamic Batching
-
特点:
- 小型道具、装饰物常用
- CPU 端合并,开销较小
-
数据示例:
Batched Draw Calls: 8
Batches: 6
Triangles: 8.9k
Vertices: 15.1k
注意:如果对象同时勾选 Static,Dynamic Batching 会被禁用。
1.2 Static Batching(静态批处理)
-
作用:将静态 Mesh 合并顶点缓冲,减少 Draw Call。
-
要求:
- 对象必须勾选 Static → Batching Static
- 可处理大型 Mesh
-
特点:
- CPU 端开销较高
- GPU Draw Call 显著减少
- 与 GPU Instancing 冲突,启用 Static 后 Instancing 不生效
-
数据示例:
Batched Draw Calls: 996
Batches: 41
Triangles/Vertices: 显示为 0(Unity 统计方式)
使用 Static Batching 后,Statistics 面板中 Batches 数量减少,Saved by Batching 数量增加,说明 Draw Call 被合并。
1.3 GPU Instancing(GPU 实例化)
-
作用:一次 Draw Call 绘制大量相同 Mesh 的实例,适合重复物体(树、草、箱子)。
-
生效条件:
- 所有实例使用同一个材质 Asset,并勾选 Enable GPU Instancing
- Shader 支持 Instancing(带
#pragma multi_compile_instancing
) - Mesh 必须一致
- 对象在场景中被渲染(Active + Renderer enabled)
- ShadowCaster、LightProbe 等特殊效果可能干扰
-
特点:
- CPU 开销低,GPU 端直接绘制实例
- Draw Call 显著减少,但 Batches 统计不一定立即变化
-
常见问题:
-
启用 Instancing 后 Statistics 未变化:
- 材质不完全共享
- Shader 不支持 Instancing
- Shadow/LightProbe 干扰
- Stats 面板刷新滞后
-
-
排查方法:
- Frame Debugger:查看 Instanced Mesh 是否合批
- 确认材质和 Shader 设置
- 暂时关闭 Shadow、LightProbe 测试
示例:154 个相同材质的 Mesh,如果 Instancing 没生效,Statistics 面板 Batches 数量不会减少。
二、Unity Draw Call 优化策略
特性 | Dynamic Batching | Static Batching | GPU Instancing |
---|---|---|---|
对象状态 | 可移动 | 静态 | 可移动或静态 |
顶点限制 | ≤ 300 | 无限制 | 无限制 |
材质要求 | 相同材质 | 可不同 | 相同材质 |
Shader 要求 | 支持 Dynamic | 任意 | 支持 Instancing |
Draw Call 优化 | CPU 合并小 Mesh | CPU 合并静态 Mesh | GPU 同时绘制实例 |
适用场景 | 小道具、装饰 | 大场景静态建筑、地形 | 大量重复物体(树、草) |
性能开销 | CPU 较小 | CPU 较高 | CPU 较低,GPU 优化 |
实用策略:
- 小型道具 → Dynamic Batching
- 大型静态场景 → Static Batching
- 大量重复物体 → GPU Instancing
- 组合策略 → 根据对象类型选择不同方法,避免冲突
三、Unity 各批处理功能启用方法
3.1 Dynamic Batching
-
全局开关:
- Edit → Project Settings → Player → Other Settings → Rendering → 勾选 Dynamic Batching
参考文档:
https://docs.unity.cn/6000.2/Documentation/Manual/dynamic-batching-enable.html
-
对象要求:
- 顶点数 ≤ 300
- 可移动
- 相同材质
- Shader 支持 Dynamic Batching
-
检查生效:
- Profiler → Dynamic Batching → Batched Draw Calls > 0 表示已生效
3.2 Static Batching
- 勾选 Static → Batching Static
- 注意与 GPU Instancing 冲突
启用后 Batches 数量减少,Saved by Batching 增加
3.3 GPU Instancing
- 材质 Inspector → 勾选 Enable GPU Instancing
- 确认 Shader 支持 Instancing
- Frame Debugger 查看实例化是否生效
- 避免与 Static Batching 冲突
四、总结
-
SetPass Calls / Draw Calls / Batches 是衡量渲染性能的核心指标:
- Draw Call → GPU 调用次数
- SetPass Call → 材质切换次数(CPU 开销)
- Batches → 批处理优化后 Draw Call 数
-
Dynamic Batching:小物体移动时自动优化
-
Static Batching:静态物体优化 Draw Call,但会禁用 Instancing
-
GPU Instancing:大量重复物体首选,CPU 开销低,GPU 实例化绘制
-
优化策略:小物体用 Dynamic、静态大物体用 Static、重复物体用 Instancing,组合使用效果最佳