缓慢会话(仅限游戏)

缓慢会话是 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均匀地分配帧,从而减少帧率的变化,创建更流畅的游戏体验。

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

虚幻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入门代码实验室指导您完成设置Vulkan渲染管线,然后在屏幕上渲染带纹理的旋转三角形。使用代码实验室了解如何渲染游戏图形。

如何在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提供启动时建议。

如何在虚幻游戏引擎中使用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上的动态热、CPU和GPU管理功能,Android动态性能框架(ADPF)优化游戏。重点是游戏,但您也可以将这些功能用于其他性能密集型应用程序。

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

以下是主要ADPF功能

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

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

将自适应功能集成到您的原生游戏中代码实验室指导您将ADPF功能集成到您的游戏中,其中包含您可以按照自己的节奏遵循的步骤。在代码实验室结束时,您将已集成以下功能

  • 热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 下载插件。此插件通过设置 虚幻控制台值来更改功能。