下面是一份聚焦于 减少 Draw Call(批次) 的 Unity 优化教程,分为分析定位、内置技术与进阶方案三大部分。
1. 定位瓶颈
Frame Debugger
打开 Window → Analysis → Frame Debugger,逐帧查看当前 Draw Call 列表,识别哪些物体或哪些材质频繁切换。
Profiler(Rendering Module)
打开 Unity Profiler,在 Rendering 模块下观察 “Batches” 数值,结合 Timeline 定位高峰时段。
Stats 面板
在 Game 视图右上角点击 Stats,实时查看当前 Draw Calls 数量。
2. Unity 内置批处理技术
2.1 静态批处理(Static Batching)
启用方式:在 GameObject 的 Inspector 勾选 Static → Batching Static。
原理:编辑器打包时将相同材质、可静态合并的 Mesh 聚合到一个大 Mesh,从而共用一次 Draw Call。
适用场景:场景中不移动、且材质相同的环境物件(地形、建筑、道具等)。
2.2 动态批处理(Dynamic Batching)
启用方式:在 Player Settings → Other Settings → 勾选 Dynamic Batching。
限制:
每个 Mesh 顶点数 < 300(含法线、UV、颜色等缓冲)。
材质使用相同 Shader、相同贴图。
注意:顶点数高时禁用,避免额外 CPU 开销。
2.3 GPU Instancing
启用方式:
在材质 Inspector 勾选 Enable GPU Instancing。
使用
Graphics.DrawMeshInstanced
或MeshRenderer
自动批量渲染。
示例:
public class InstancingExample : MonoBehaviour { public Mesh mesh; public Material mat; Matrix4x4[] matrices; void Start() { int count = 50; matrices = new Matrix4x4[count]; for (int i = 0; i < count; i++) { matrices[i] = Matrix4x4.TRS( new Vector3(i * 2f, 0, 0), Quaternion.identity, Vector3.one ); } } void Update() { // 每帧一次 DrawMeshInstanced,50 个实例仅一条 Draw Call Graphics.DrawMeshInstanced(mesh, 0, mat, matrices); } }
优势:适用于大量同款网格、同材质的小物件(树木、草丛、勾玉等)。
3. 材质与贴图优化
Texture Atlas(贴图集)
将多个小贴图合并到一张大贴图,减少材质切换。
对 2D Sprite 可使用 Sprite Atlas:Window → 2D → Sprite Atlas。
合并材质
若多个 Mesh 使用不同材质但贴图可合并,统一到单一材质或同一个 Shader Variant。
剔除无用 Pass
对自定义 Shader,删除不必要的 Pass(如 ShadowCaster、MotionVectors)。
4. 渲染管线优化
4.1 SRP Batcher(仅 URP/HDRP)
启用方式:在 Graphics Settings → Scriptable Render Pipeline Settings 中勾选 SRP Batcher。
效果:减少 CPU 对 Draw Call 的开销,并可与 GPU Instancing 叠加。
4.2 URP Forward+ / Clustered Rendering
对光源计数多、透明物体多的场景,使用 URP Forward+ 或 聚类渲染,减少额外 Draw Call。
5. 剔除与合批配合
遮挡剔除(Occlusion Culling)
Window → Occlusion Culling,Bake 完成后自动剔除被完全遮挡的批次。
视距剔除(Distance Culling)
使用 LODGroup,对远距离物体绘制简化网格或直接隐藏。
混合批处理策略
对于大型静态环境,优先静态批处理;
对于少量可移动物体且顶点数少,开启动态批处理;
对于大量重复物件,使用 GPU Instancing。
6. 自动化工具与插件
Mesh Baker:支持运行时/编辑时合并 Mesh 与贴图集,自动化批处理。
Simplygon(付费或 Unity 内置):高质量自动化网格简化与批处理。
7. 最佳实践流程
性能分析:先用 Profiler + Frame Debugger 定位 Draw Call 高峰。
贴图合并:将小贴图打 Atlas,减少材质切换。
静态批处理:标记场景中绝大多数环境物体为 Static。
动态批处理:对小型可移动物体启用 Dynamic Batching。
GPU Instancing:对同款重复物体批量绘制。
开启 SRP Batcher:若使用 URP/HDRP,确保 SRP Batcher 激活。
剔除配合:Bake Occlusion Culling & 设定 LOD,减少不必要的 Draw Call。
迭代优化:每次改动后重新 Profile,保证实际批次下降。
通过以上系统化手段,你可以在不同类型场景与物体上灵活组合,最大程度地压缩 Draw Call 数量,从而获得更稳定、更高的渲染帧率。祝调优顺利!