UPL2-3——GPU Usage 模块

本章内容涉及图形接口知识,相关内容可见:US1L7——必备的图形程序接口概念
本章还涉及一些 Shader 相关概念,具体可见:US——Unity Shader开发入门

GPU Usage 模块

GPU Usage(使用率)是 Unity Profiler 中最重要的性能分析模块之一,用于 分析 GPU(图形处理器)在一帧中在哪些渲染阶段上花了多少时间

游戏开发中会造成GPU开销的主要有:

  1. 几何处理:模型顶点相关处理
  2. 光照计算:阴影、反射等
  3. 渲染输出:Shader 处理、对象渲染、游戏画面显示
  4. 屏幕后处理 Shader 部分:屏幕画面特殊效果(模糊、黑白、景深等等)
  5. 纹理处理:采样、解压缩、贴图操作等
  6. 特效处理:粒子、流体、烟雾等等

等等

一般项目出现卡顿、掉帧问题、图像问题、发热、掉电快等情况可以着重排查 GPU 和 CPU 使用情况,
它们的异常表现几乎一致,根本原因通常是计算压力过大

GPU 和 CPU 计算的区别在于:

  • CPU 专注于 游戏逻辑 处理相关(物理、脚本、AI、动画控制等等)
  • GPU 专注于 图形渲染 处理相关(Shader、模型绘制、光照、特效、后处理等等)

注意:

  1. GPU Usage 的数据收集 会影响性能表现
  2. 会禁用 GPU Jobs(图形工作线程优化)
  3. 并不支持显示详细的 URP 和 HDRP 相关数据(仅支持内建渲染管线)

关于 GPU Usage 的注意事项

GPU Usage 默认是关闭的,需要去顶部页签的 Profiler Modules(模块列表) 处勾选 GPU Usage 才可启用,详见:UPL2-1——顶部页签
GPU Usage 会有一个警告,提示大致意思为:

image

采集 GPU Profiler 数据会禁用图形作业、增加性能开销,并降低 CPU 模块的准确性。如果你不需要这些数据,请关闭此模块。

HDRP 和 URP 渲染器当前不受支持: 如果启用了这些渲染器,Profiler 将不会显示大多数 GPU 标记。(如果你的工程是 URP 或 HDRP 的)

注意:

  1. Graphics Jobs 是 Unity 用于加速渲染流程的多线程技术,开启 GPU Profiler 会关闭它,影响性能测试的真实性。

  2. 在使用 URP(通用渲染管线)或 HDRP(高清渲染管线) 时,GPU 模块不会显示详细的 GPU 时间采样(比如各个 pass、shader 的耗时),所以数据不完整

    image

建议:
如果你只关心 CPU 性能或者使用 SRP(如 URP/HDRP),可以暂时关闭 GPU Profiler。除非你在测试传统内置渲染管线的 GPU 性能。
对于 SRP(URP/HDRP)我们可以使用 Rendering Debugger 进行性能检测(以后再讲解 URP 先关知识时,(#TODO#))

要开启 Rendering Debugger:工具栏 ——> Window ——> Analysis ——> Rendering Debugger

imageimage

GPU Usage 中各参数功能的含义和作用

image

  • GPU 使用率 分析窗口 在这里通过不同模块不同颜色表达,我们可以直观的看到每一个模块对GPU的使用情况

    • Opaque: 内置渲染管线渲染 不透明对象的时间
    • Transparent:内置渲染管线渲染 透明对象的时间
    • Shadows/Depth:内置渲染管线渲染 阴影贴图/深度贴图 的时间(比如阴影贴图生成、摄像机深度图)
    • Deferred Geometry:内置延迟渲染管线处理 延迟几何通道的时间;用于延迟渲染管线,写入 GBuffer 阶段
    • Deferred Lighting:内置延迟渲染管线处理 延迟光照通道的时间;从 GBuffer 读取信息并执行光照计算
    • PostProcess:内置渲染管线处理 屏幕后期处理效果的时间
    • Other:处理可编程渲染管线等其他事务的渲染时间(比如 URP 或者 HDRP),还有其他无法分类的 GPU 开销,如一些插件、系统调用等

    使用建议: 我们主要就是根据具体的数据表现,特别是在内置渲染管线中 可以通过这些数值明确的知道是那一块渲染相关出现的性能问题,然后针对性的优化即可

    注意:该模块并不是支持所有的平台调试,对于不支持的平台我们只有在特定平台上用特定工具调试 比如 IOS 使用 Xcode 的 GPU Frame Debugger

    平台 图形 API 状态
    Windows DirectX 11、DirectX 12、OpenGL 受支持
    Vulkan 不支持
    macOS OpenGL 支持。注意: Apple 已废弃对 OpenGL 的支持。
    Metal 不支持。改用 XCode 的 GPU 帧调试器 UI。
    Linux OpenGL Core 受支持
    Vulkan 不支持
    WebGL 所有 WebGL 不支持
    Android OpenGL 在运行 NVIDIA 或 Intel GPU 的设备上受支持。
    Vulkan 不支持
    iOS、tvOS Metal 不支持。改用 XCode 的 GPU 帧调试器 UI。
    Tizen OpenGL 不支持。
  • 模块详细信息面板显示模式(窗口下方的显示模式)

    • Hierarchy:层级视图

      最常用的分析视图,展示 GPU 所做工作的树状结构(父子关系),将 GPU 操作按 渲染流程 的逻辑顺序组织
      适用于:识别哪个阶段(如阴影、后处理)消耗了 GPU 时间,分析 GPU 执行的整体结构

      image

    • Raw Hierarchy:原始层级视图

      更接近 GPU 实际命令流的视图,展示 未经整理的 GPU 操作列表 所有 GPU 调用按记录顺序直接列出(无父子结构)
      没有逻辑分组,也没有折叠结构,像一张“流水账”。
      适用于: 精细诊断性能问题时,确认某一个 Drawcall 或 GPU Pass 造成了卡顿,查看某条 GPU 调用命令具体花了多长时间

      image

  • Hierarchy(层级视图)相关关键信息

    image

    • Overview 显示调用路径或函数名的层级结构(如 PlayerLoop​ > RenderPipelineManager.DoRenderLoop

    • Total 当前函数及其所有子函数占据本帧 GPU 总耗时的百分比(%)

    • DrawCalls 该函数在本帧触发的渲染调用次数(Draw Call 的数量)

    • GPU ms 当前函数在 GPU 上的耗时(单位:毫秒)

    • 函数调用详细信息相关选项

      • No Details 只显示基本数据(默认)

      • Related Data 显示与当前函数相关的纹理、材质、shader 等资源信息

        image

      • Calls 显示底层的绘制调用(如 DrawMesh、Blit)

        image

GPU Usage 对于我们的意义

  1. 分析掉帧来源

    如果帧时间高于 16ms(60FPS)或其它预定帧率,看看 GPU 有没有占用太多时间

  2. 优化瓶颈定位

    例如发现 PostProcess(屏幕后处理) 占用 5ms,就可以尝试禁用或简化后处理

  3. DrawCall 分析

    搭配右侧 Hierarchy 面板查看哪些方法触发了多少 DrawCall,以及 GPU 耗时

等等