分析和优化游戏性能

本指南介绍了在 Android 设备上分析和优化游戏性能的流程,以实现流畅的用户体验。它涵盖了识别性能瓶颈、区分 CPU 和 GPU 问题,以及验证优化结果。

无论游戏多么有趣或吸引人,如果无法在移动设备上流畅运行,玩家就不会喜欢,游戏也不会那么成功。即使是好玩的游戏也可能会出现每秒帧数 (FPS) 低或设备过热等问题。这些问题会让玩家感到不快。因此,提升游戏性能至关重要,您必须了解如何优化游戏性能。

性能优化流程包括以下步骤:

  1. 衡量游戏的整体性能。量化每个场景的性能降幅,以精确定位异常情况。

  2. CPU 和 GPU 绑定检查。确定根本原因,无论是 CPU 限制还是 GPU 限制。

    工具:Unreal Insight、Unity Profiler、Perfetto 和性能测量工具。

  3. CPU 优化。纠正发现的性能瓶颈。

    工具:Unreal Insight、Unity Profiler、Perfetto 和 Simpleperf。

  4. GPU 优化。纠正发现的性能瓶颈。

    工具:RenderDoc、Arm Mobile Studio、AGI、供应商专用工具。

  5. A/B 测试。进行 A/B 测试,以严格验证所实施的优化措施的有效性。

    工具:Unreal Insight、Unity Profiler、Perfetto 和性能测量工具、CPU 或 GPU 频率锁定以及 RenderDoc。

  6. 此迭代过程 (1-5) 会一直持续,直到成功实现目标 FPS 和热参数。

前提条件

分析全面的游戏表现

您必须检查游戏的整体性能,并确定任何基于场景的性能下降或异常情况。在优化游戏之前,请先检查游戏的当前性能。由于游戏包含许多界面和场景,因此请分析 CPU 或 GPU 使用率较高的场景或性能出乎意料的布局,以监控每个场景的性能下降情况和 CPU 或 GPU 利用率。

  1. 量化性能降幅:使用性能测量工具来测量游戏的整体性能。按场景衡量性能,以找出性能下降或出现异常的具体区域。
  2. 找出有问题的场景:分析数据,找出 CPU 或 GPU 使用率高的场景,或屏幕布局无法产生预期性能的场景。
  3. 收集轨迹数据:使用轨迹工具收集已发现的问题场景的详细性能数据。

确定 CPU 或 GPU 瓶颈

如果游戏未达到目标 FPS,请确定它是受 CPU 限制还是受 GPU 限制。分析 CPU 和 GPU 行为对于寻找优化机会至关重要,即使设备在游戏过程中发热或耗电过多也是如此。您可以使用各种方法来确定系统是受 CPU 限制还是受 GPU 限制。

  1. 分析跟踪数据:使用您偏好的工具分析跟踪数据:

    • Unreal Insight (Unreal Engine):分析轨迹以查看 GameThreadRenderThreadRHIThread 的时间安排。
      • 如果 GameThreadRenderThread 超过帧时间限制(例如,30 FPS 时为 33.3 毫秒),则游戏为 CPU 受限
      • 如果 RHIThread 表现出长时间执行或占帧时间的大部分,则游戏是 GPU 绑定的。
    Unreal Insight 轨迹时间轴,显示了 GameThread、RenderThread 和 RHIThread 的执行时间
    图 2. 包含 GameThread、RenderThread 和 RHIThread 的 Unreal 洞见轨迹(点击可放大)。
    • Unity 分析器 (Unity):如果主线程在 Gfx.WaitForPresentOnGfxThread 等标记上消耗大量时间,而渲染线程显示 Gfx.PresentFrame<GraphicsAPIName>.WaitForLastPresent,则游戏属于 GPU 瓶颈
    Unity Profiler 时间轴显示了主线程等待 Gfx.WaitForPresentOnGfxThread
    图 3. Unity 分析器的 GPU 绑定示例(点击可放大)。
    • Perfetto:分析 CPU 核心分配和线程执行详情。通过详细查看线程执行信息,此分析有助于识别性能瓶颈。
    • CPU 开销:轨迹表明,GameThreadRenderThread 上的工作负载与 VSync 结合在一起,导致 RHI 线程的 QueuePresent 出现延迟,从而表明这是一个受 CPU 限制的场景。

      Perfetto 轨迹,显示了 GameThread、RenderThread 和 RHIThread 的执行时间
      图 4. 包含 CPU 执行详细信息的 Perfetto 轨迹(点击可放大)。
    • GPU 开销:如果 GPU 完成时间超过帧时间限制(例如 25 毫秒),则游戏会受到 GPU 限制。轨迹表明 GPU 完成时间超过 25 毫秒,这表示属于 GPU 绑定场景。

      Perfetto 轨迹,显示了 GPU 完成块等待 GPU 完成
      图 5. 包含 GPU 开销详细信息的 Perfetto 轨迹(点击可放大)。
  2. 使用 Unreal Engine 统计信息命令

    • stat unit:比较分配给游戏、绘制和 RHI 线程的时间。 如果游戏时间和绘制时间较低,但 RHI 时间始终超过帧时间限制,则游戏受 GPU 限制。例如,如果所需的 FPS 为 30(相当于每帧 33.33 毫秒),并且游戏线程和绘制线程始终保持在 10-15 毫秒范围内,但 RHI 始终超过 30 毫秒,则强烈表明存在 GPU 瓶颈。
    显示帧、游戏、绘制、GPU 和 RHIT 执行时间的统计信息单元叠加层
    图 6. 统计单位有助于估计 GPU 绑定条件。
    • stat VulkanRHI:检查队列提交和队列呈现时长。
    显示队列提交和队列呈现的周期计数器的 Stat VulkanRHI 叠加层
    图 7. Stat VulkanRHI 有助于估计 GPU 绑定条件(点击可放大)。
    • stat slow:仔细检查分配给游戏、渲染和 RHI 线程的时间,以找出阻碍因素。
  3. 查看效果指标:使用全面的游戏效果分析结果。在 Android 设备上:

    • CPU 受限:CPU(已归一化)使用率高于 15%,但 GPU 使用率和 FPS 较低。
    • 受 GPU 限制:GPU 使用率高于 90%。

    通常,如果 FPS 和 GPU 使用率较低,而 CPU 使用率超过 15%,则可认为这种情况属于 CPU 瓶颈。

    突出显示 CPU 受限和 GPU 受限场景的性能指标表格
    图 8. 包含 CPU 和 GPU 用量的性能指标。

优化 CPU 性能

如果分析表明游戏受 CPU 限制,请进一步调查以找出导致瓶颈的具体线程或 API。

如需详细指导,请参阅 Android 的 CPU 和 GPU 优化提示

优化 GPU 性能

如果分析表明游戏受 GPU 限制,请使用帧调试器进一步调查,以分析渲染流水线和绘制调用。

如需详细指导,请参阅 Android 的 CPU 和 GPU 优化提示

验证优化效果

  1. 进行 A/B 测试:创建已实现优化的 build。
  2. 衡量性能:使用初始分析中使用的相同工具和方法来衡量优化后的 build 的性能。
  3. 比较结果:将新的性能数据与初始数据进行比较,以确认已解决识别出的瓶颈问题,并且已达到 FPS 和散热目标。
  4. 迭代:重复执行分析和优化步骤,直到达到所需性能。

另请参阅