缓慢的会话

缓慢的会话是 Google Play 管理中心中的一项新的 Android 性能指标。缓慢的会话是指超过 25% 的帧速度缓慢的会话。如果帧在上一帧呈现后不到 50 毫秒(相当于 20 FPS)呈现,则该帧速度缓慢。Android 性能指标还会报告第二个缓慢的会话指标,其目标为 34 毫秒(相当于 30 FPS)。通过使用缓慢的会话,您可以了解游戏的帧速率性能,这会影响游戏对用户的流畅度和流畅感。

随着时间的推移,Play 将开始引导用户远离无法在其手机上达到 20 FPS 的游戏。请注意,Android 性能指标仅在您的游戏运行一分钟后才开始监控帧速率。

访问我们的 帮助中心 了解有关该指标的更多详细信息。

Pie chart-like graphics that show the number of slow frames and non-slow frames.
图 1. Android 性能指标中的缓慢会话。

如何测量 FPS 并检测缓慢的帧

Android dumpsys surfaceflinger timestats 命令提供了所有正在渲染的层的平均 FPS 和从呈现到呈现的计时直方图。帧的从呈现到呈现时间是当前帧和之前帧绘制之间的间隔。以下是如何使用该命令收集游戏 FPS 的分步说明

  1. 使用标志 enableclear 运行该命令以开始捕获信息

    adb shell dumpsys SurfaceFlinger --timestats -clear -enable
    
  2. 当游戏玩得足够长时间时,再次使用标志 dump 运行该命令以转储信息

    adb shell dumpsys SurfaceFlinger --timestats -dump
    

    转储的信息提供了由 SurfaceFlinger 渲染的所有层的总帧数和 presentToPresent 直方图。您必须通过基于 layerName 过滤来找到游戏的节段

    layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833
    

    可以根据每层的帧信息计算会话的慢帧速率。

    例如,20 FPS 慢帧百分比 = (从 54 毫秒到 1000 毫秒的值之和) / 总帧数 x 100

    totalFrames = 274
    ...
    presentToPresent histogram is as below:
    0ms=0 1ms=0 2ms=0 3ms=0 4ms=0 5ms=0 6ms=0 7ms=0 8ms=0 9ms=0 10ms=0 11ms=0 12ms=0
    13ms=0 14ms=0 15ms=0 16ms=1 17ms=0 18ms=0 19ms=0 20ms=0 21ms=0 22ms=0 23ms=0
    24ms=0 25ms=0 26ms=0 27ms=0 28ms=0 29ms=0 30ms=0 31ms=0 32ms=0 33ms=269 34ms=0
    36ms=0 38ms=0 40ms=0 42ms=0 44ms=0 46ms=0 48ms=0 50ms=1 54ms=0 58ms=0 62ms=0
    66ms=0 70ms=1 74ms=0 78ms=0 82ms=0 86ms=0 90ms=0 94ms=0 98ms=0 102ms=0 106ms=0
    110ms=0 114ms=0 118ms=0 122ms=0 126ms=0 130ms=0 134ms=0 138ms=0 142ms=0 146ms=0
    150ms=0 200ms=0 250ms=0 300ms=0 350ms=0 400ms=0 450ms=0 500ms=0 550ms=0 600ms=0
    650ms=0 700ms=0 750ms=0 800ms=0 850ms=0 900ms=0 950ms=0 1000ms=0
    

    每个层的平均 FPS 也显示在转储中

    ...
    averageFPS = 30.179
    ...
    
  3. 收集完所有信息后,您应该使用标志 disable 禁用 timestats

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

慢帧原因和解决方案

帧在屏幕上呈现或渲染的时间可能比开发人员的目标时间更长,原因有很多。游戏可能是CPU/GPU 绑定的。或者设备正在过热并激活节流的热状态。或者游戏的帧速率与设备的显示刷新率不匹配

使用 Android 帧步进(Swappy)VulkanADPF 来解决这些问题并提高游戏的性能。

什么是 Swappy

Android 帧步进库,也称为 Swappy,是 AGDK 库 的一部分。Swappy 帮助 OpenGL 和 Vulkan 游戏在 Android 上实现平滑渲染和正确的帧步进。

帧步进是将游戏的逻辑和渲染循环与操作系统的显示子系统和底层显示硬件同步。Android 显示子系统旨在避免在显示硬件在更新中途切换到新帧时可能发生的视觉伪影(称为撕裂)。为了避免这些伪影,显示子系统会执行以下操作

  • 在内部缓冲过去帧
  • 检测延迟的帧提交
  • 在检测到延迟的帧时重复显示过去的帧

如何在原生项目中使用 Swappy

请参阅以下指南,将 Android 帧步进库集成到您的游戏中

如何在 Unity 游戏引擎中使用 Swappy

Unity 已将其引擎中集成了 Android 帧步进。要在此功能在 Unity 2019.2 或更高版本中启用,请选中项目设置 > 播放器 > 设置Android > 分辨率和呈现的优化帧步进复选框

Project settings dialog.
图 2. 在 Unity 引擎中启用帧步进。

或者,可以在您的逻辑代码中以编程方式启用 优化帧步进选项,以允许 Unity 平均分配帧,以减少帧速率的变化,从而创造更流畅的游戏体验。

如何在 Unreal 游戏引擎中使用 Swappy

Unreal 4.25 及更高版本集成了 Android 帧步进库,它是 Android 游戏开发工具包 的一部分。 移动帧步进 文章说明了如何启用 Android 帧步进库以及如何从 C++ 代码控制帧步进。

什么是 Vulkan

Vulkan 是一个现代跨平台 3D 图形 API,旨在最大程度地减少设备图形硬件与游戏之间的抽象。Vulkan 是 Android 上的主要低级图形 API,取代了 OpenGL ES。OpenGL ES 仍然在 Android 上受支持,但不再处于积极的功能开发中。

与 OpenGL ES 相比,Vulkan 提供以下优势

  • 更有效的架构,图形驱动程序中的 CPU 开销更低
  • 新的优化策略,以提高 CPU 性能
  • OpenGL ES 中没有的新图形功能,例如无绑定 API 和光线追踪

如何在原生 Android 项目中使用 Vulkan

Android Vulkan 入门 Codelab 指导您完成设置 Vulkan 渲染管道的过程,然后在屏幕上渲染一个带纹理的旋转三角形。使用此 Codelab 学习如何渲染游戏图形。

如何在 Unity 游戏引擎中使用 Vulkan

要启用 Unity 上的自动设备选择,请按照以下步骤配置 自动图形 API

Project settings dialog.
图 3. 启用 Unity 自动图形 API。

或者,您可以通过禁用自动图形 API,并将 Vulkan 放在图形 API 列表中的最高优先级来手动启用 Vulkan。如果您使用的是 Unity 2021.1 或更早版本,这是使用 Vulkan 的唯一方法。

Project settings dialog.
图 4. 在 Unity 中手动选择 Vulkan 作为主要图形 API。

使用 VkQuality Unity 引擎插件 为您的游戏提供针对特定设备使用的图形 API 的启动时推荐。

如何在 Unreal 游戏引擎中使用 Vulkan

要启用 Vulkan 图形 API,请导航至项目设置 > 平台 > Android > 构建,然后选择支持 Vulkan。当您同时选择支持 Vulkan支持 OpenGL ES3.2时,虚幻引擎将默认使用 Vulkan。如果设备不支持 Vulkan,虚幻引擎将回退到 OpenGL ES 3.2。

Project settings dialog.
图 5. 在虚幻引擎中启用 Vulkan。

如果您正在使用某些已知在特定设备上行为不佳的 Vulkan 功能,您可以自定义您的BaseDeviceProfile.ini 文件以排除这些设备。查看为 Android 自定义设备配置文件和可扩展性了解如何自定义BaseDeviceProfile.ini。随着新的设备驱动程序可能会修复之前已知的不良设备,请保持您的BaseDeviceProfile.ini 文件更新,以获得所有优化。

什么是 ADPF

Android 动态性能框架 (ADPF)根据 Android 上的动态热量、CPU 和 GPU 管理功能优化游戏。重点是游戏,但您也可以将这些功能用于其他性能密集型应用程序。

ADPF 是一组 API,允许游戏和性能密集型应用程序更直接地与 Android 设备的电源和热量系统交互。使用这些 API,您可以监控 Android 系统的动态行为,并在不会使设备过热的可持续水平上优化游戏性能。

以下是主要的 ADPF 功能

  • 热量 API:监控设备的热量状态,以便应用程序可以在变得不可持续之前主动调整工作负载。
  • CPU 性能提示 API:提供性能提示,让 Android 为工作负载选择正确的性能设置(例如,CPU 操作点或核心)。
  • 游戏模式 API 和游戏状态 API:根据用户的设置和游戏特定的配置,通过优先考虑性能或电池寿命特性来启用游戏玩法优化。
  • 固定性能模式:在基准测试期间在设备上启用固定性能模式,以获取不会因动态 CPU 时钟而改变的测量结果。
  • 节能模式:告诉会话性能提示会话中的线程可以安全地调度以优先考虑节能而不是性能。适用于 Android 15(API 级别 35)。

如何在原生 Android 项目中使用 ADPF

将适应性功能集成到您的原生游戏中codelab 指导您将 ADPF 功能集成到您的游戏中,并提供您可以按自己的节奏遵循的步骤。在 codelab 结束时,您将已集成以下功能

  • 热量 API:监听设备热量状况,并在设备进入热量限制状态之前做出反应。
  • 游戏模式 API:了解玩家的优化偏好(最大化性能或节省电池)并做出相应的调整。
  • 游戏状态 API:让系统了解您的游戏状态(加载、播放、UI 等),系统可以相应地调整资源(提高 I/O 或 CPU、GPU 等)。
  • 性能提示 API:让系统了解您的线程模型和工作负载,以便系统可以相应地分配资源。

如何在 Unity 游戏引擎中使用 ADPF

Unity 的自适应性能是针对希望优化其移动设备游戏的游戏开发人员的工具,尤其是针对多样化的 Android 生态系统。自适应性能使您的游戏能够实时适应设备的性能和热量特性,从而确保流畅高效的游戏体验。

自适应性能 Android 提供程序指导您完成在 Unity 中实施 ADPF 的步骤。

Project settings dialog.
图 6. 在 Unity 引擎中集成 ADPF。

如何在虚幻游戏引擎中使用 ADPF

Project settings dialog.
图 7. 在虚幻引擎中集成 ADPF。
  1. 下载插件
  2. 将插件复制到项目插件文件夹
  3. 在虚幻编辑器中启用 ADPF 虚幻引擎插件
  4. 重新启动虚幻编辑器
  5. 构建和烹饪游戏

Android 动态性能框架(ADPF) 插件针对虚幻引擎提供稳定的性能并防止热量限制。从 GitHub 上下载插件。此插件通过设置虚幻控制台值来更改功能。