关注

【性能优化】Unity 渲染优化全解析:Draw Call、Batch、SetPass 与批处理技术


Unity 渲染优化全解析:Draw Call、Batch、SetPass 与批处理技术

在 Unity 开发中,性能优化是保证游戏流畅的核心环节。尤其在移动端或 VR/AR 场景,Draw Call 过多、材质切换频繁都会严重影响帧率。

本文将从 Unity Statistics 面板参数解析入手,深入讲解 Dynamic Batching、Static Batching 与 GPU Instancing,并提供实用优化策略和排查方法,帮助开发者快速提升渲染性能。


一、Unity Statistics 参数解析

在 Unity 中,打开 Ctrl+7(Profiler) 或者 Stats 面板,可以看到场景渲染的核心指标:

在这里插入图片描述

核心参数说明

参数含义
SetPass Calls材质切换次数,每次切换都会触发 GPU 管线状态更新,CPU 开销较大
Draw Calls实际提交给 GPU 的绘制调用次数
BatchesUnity 优化后的批处理数量(经过 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 BatchingStatic BatchingGPU Instancing
对象状态可移动静态可移动或静态
顶点限制≤ 300无限制无限制
材质要求相同材质可不同相同材质
Shader 要求支持 Dynamic任意支持 Instancing
Draw Call 优化CPU 合并小 MeshCPU 合并静态 MeshGPU 同时绘制实例
适用场景小道具、装饰大场景静态建筑、地形大量重复物体(树、草)
性能开销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,组合使用效果最佳

转载自CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/qq_41140324/article/details/150994667

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--