Administrator
发布于 2025-05-23 / 3 阅读
0

DC优化

下面是一份聚焦于 减少 Draw Call(批次) 的 Unity 优化教程,分为分析定位、内置技术与进阶方案三大部分。


1. 定位瓶颈

  1. Frame Debugger

    • 打开 Window → Analysis → Frame Debugger,逐帧查看当前 Draw Call 列表,识别哪些物体或哪些材质频繁切换。

  2. Profiler(Rendering Module)

    • 打开 Unity Profiler,在 Rendering 模块下观察 “Batches” 数值,结合 Timeline 定位高峰时段。

  3. 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

  • 启用方式

    1. 在材质 Inspector 勾选 Enable GPU Instancing

    2. 使用 Graphics.DrawMeshInstancedMeshRenderer 自动批量渲染。

  • 示例

    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. 材质与贴图优化

  1. Texture Atlas(贴图集)

    • 将多个小贴图合并到一张大贴图,减少材质切换。

    • 对 2D Sprite 可使用 Sprite Atlas:Window → 2D → Sprite Atlas。

  2. 合并材质

    • 若多个 Mesh 使用不同材质但贴图可合并,统一到单一材质或同一个 Shader Variant。

  3. 剔除无用 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. 剔除与合批配合

  1. 遮挡剔除(Occlusion Culling)

    • Window → Occlusion Culling,Bake 完成后自动剔除被完全遮挡的批次。

  2. 视距剔除(Distance Culling)

    • 使用 LODGroup,对远距离物体绘制简化网格或直接隐藏。

  3. 混合批处理策略

    • 对于大型静态环境,优先静态批处理;

    • 对于少量可移动物体且顶点数少,开启动态批处理;

    • 对于大量重复物件,使用 GPU Instancing。


6. 自动化工具与插件

  • Mesh Baker:支持运行时/编辑时合并 Mesh 与贴图集,自动化批处理。

  • Simplygon(付费或 Unity 内置):高质量自动化网格简化与批处理。


7. 最佳实践流程

  1. 性能分析:先用 Profiler + Frame Debugger 定位 Draw Call 高峰。

  2. 贴图合并:将小贴图打 Atlas,减少材质切换。

  3. 静态批处理:标记场景中绝大多数环境物体为 Static。

  4. 动态批处理:对小型可移动物体启用 Dynamic Batching。

  5. GPU Instancing:对同款重复物体批量绘制。

  6. 开启 SRP Batcher:若使用 URP/HDRP,确保 SRP Batcher 激活。

  7. 剔除配合:Bake Occlusion Culling & 设定 LOD,减少不必要的 Draw Call。

  8. 迭代优化:每次改动后重新 Profile,保证实际批次下降。


通过以上系统化手段,你可以在不同类型场景与物体上灵活组合,最大程度地压缩 Draw Call 数量,从而获得更稳定、更高的渲染帧率。祝调优顺利!