【性能优化】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 渲染优化全解析:Draw Call、Batch、SetPass 与批处理技术)
    • [一、Unity Statistics 参数解析](#一、Unity Statistics 参数解析)
      • 核心参数说明
      • [1.1 Dynamic Batching(动态批处理)](#1.1 Dynamic Batching(动态批处理))
      • [1.2 Static Batching(静态批处理)](#1.2 Static Batching(静态批处理))
      • [1.3 GPU Instancing(GPU 实例化)](#1.3 GPU Instancing(GPU 实例化))
    • [二、Unity Draw Call 优化策略](#二、Unity Draw Call 优化策略)
    • [三、Unity 各批处理功能启用方法](#三、Unity 各批处理功能启用方法)
      • [3.1 Dynamic Batching](#3.1 Dynamic Batching)
      • [3.2 Static Batching](#3.2 Static Batching)
      • [3.3 GPU Instancing](#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 的实例,适合重复物体(树、草、箱子)。

  • 生效条件

    1. 所有实例使用同一个材质 Asset ,并勾选 Enable GPU Instancing
    2. Shader 支持 Instancing(带 #pragma multi_compile_instancing
    3. Mesh 必须一致
    4. 对象在场景中被渲染(Active + Renderer enabled)
    5. ShadowCaster、LightProbe 等特殊效果可能干扰
  • 特点

    • CPU 开销低,GPU 端直接绘制实例
    • Draw Call 显著减少,但 Batches 统计不一定立即变化
  • 常见问题

    • 启用 Instancing 后 Statistics 未变化

      • 材质不完全共享
      • Shader 不支持 Instancing
      • Shadow/LightProbe 干扰
      • Stats 面板刷新滞后
  • 排查方法

    1. Frame Debugger:查看 Instanced Mesh 是否合批
    2. 确认材质和 Shader 设置
    3. 暂时关闭 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 优化

实用策略

  1. 小型道具 → Dynamic Batching
  2. 大型静态场景 → Static Batching
  3. 大量重复物体 → GPU Instancing
  4. 组合策略 → 根据对象类型选择不同方法,避免冲突

三、Unity 各批处理功能启用方法

3.1 Dynamic Batching

  1. 全局开关

    • Edit → Project Settings → Player → Other Settings → Rendering → 勾选 Dynamic Batching

参考文档:
https://docs.unity.cn/6000.2/Documentation/Manual/dynamic-batching-enable.html

  1. 对象要求

    • 顶点数 ≤ 300
    • 可移动
    • 相同材质
    • Shader 支持 Dynamic Batching
  2. 检查生效

    • Profiler → Dynamic Batching → Batched Draw Calls > 0 表示已生效

3.2 Static Batching

  1. 勾选 Static → Batching Static
  2. 注意与 GPU Instancing 冲突

启用后 Batches 数量减少,Saved by Batching 增加

3.3 GPU Instancing

  1. 材质 Inspector → 勾选 Enable GPU Instancing
  2. 确认 Shader 支持 Instancing
  3. Frame Debugger 查看实例化是否生效
  4. 避免与 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,组合使用效果最佳