慢会话(仅限游戏)

“慢会话”是 Google Play 管理中心内新增的一项 Android Vitals 指标。慢 会话是指有超过 25% 的帧呈现速度缓慢的会话。框架 如果它没有在上一帧之后的 50 毫秒内呈现,则认为该帧的呈现速度缓慢 (相当于 20 FPS)。Android Vitals 还会报告第二次“慢会话” 目标为 34 毫秒(相当于 30 FPS)的指标。使用“慢会话”时 您游戏的帧速率性能 能给用户带来流畅自然的体验

Play 会在适当情况下开始引导用户避开无法 可以在手机上达到 20 FPS。请注意,Android Vitals 仅开始监控 帧速率的变化。

如需了解详情,请访问我们的帮助中心 该指标

饼图类图形,显示慢帧和非慢帧的数量。
图 1. Android Vitals 中的慢会话。

如何衡量 FPS 和检测慢帧

Android dumpsys surfaceflinger timestats 命令提供平均 FPS 和 呈现到展示的所有层的时间直方图, 。帧的“呈现到呈现”时间是指 正在绘制的当前帧和上一帧。以下是 按步骤使用该命令收集游戏的 FPS:

  1. 运行带有 enableclear 标志的命令以开始捕获数据 信息:

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

    adb shell dumpsys SurfaceFlinger --timestats -dump
    

    转储信息提供关于以下对象的总帧数和 presentToPresent 直方图 由 SurfaceFlinger 渲染的所有图层。您必须找到 根据 layerName 进行过滤,以过滤出游戏的版块

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

    会话的慢帧速率可以根据 每个层。

    例如,20 FPS 慢帧百分比 = (54 毫秒到 1000 毫秒的值总和)/ totalFrames 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 来提取时间统计信息:

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

呈现速度缓慢的原因和解决方案

有很多原因可能会导致帧在屏幕上呈现或呈现更长时间 高于开发者的目标游戏可能受限于 CPU/GPU。或 设备过热并进入节流热状态。或 游戏的帧速率和设备的显示不一致 刷新率

使用 Android Frame Pacing (Swappy)VulkanADPF 从而解决这些问题,提升游戏性能

什么是 Swappy

Android Frame Pacing 库(也称为 Swappy)是 AGDK 库。Swappy 助力 OpenGL 和 Vulkan 游戏 在 Android 上实现流畅的渲染和正确的帧同步。

帧同步是指游戏逻辑和渲染循环与 操作系统的显示子系统和底层显示硬件。Android 展示子系统旨在避免视觉伪影(称为“撕裂”) 在显示硬件中途切换到新帧时可能出现的错误 更新。为了避免这些伪影,显示子系统会 以下:

  • 在内部缓冲之前的帧
  • 检测延迟帧的提交情况
  • 检测到延迟帧时重复显示之前的帧

如何在原生项目中使用 Swappy

请参阅以下指南,了解如何集成 Android Frame Pacing 库 :

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

Unity 已将 Android Frame Pacing 集成到其引擎中。要启用此选项, Unity 2019.2 中的功能 或更高版本,请选中 Project Settings > 播放器 >Android > 设置分辨率和呈现效果

项目设置对话框。
图 2. 在 Unity Engine 中启用 Frame Pacing。

或者,您也可以以编程方式在逻辑代码中启用 Optimized Frame Pacing 选项,以允许 Unity 均匀地加载 分布帧以减少帧速率差异,从而打造更流畅的游戏体验。

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

Unreal 4.25 及更高版本集成了 Android Frame Pacing 库,该库是 Android Game Development KitMobile Frame Pacing 一文介绍了如何启用 Android Frame Pacing 库以及如何通过 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 上启用自动设备选择功能,请按以下步骤配置 Auto Graphics API

项目设置对话框。
图 3. 启用 Unity Auto Graphics API。

或者,您也可以通过停用 Auto Graphics API 来手动启用 Vulkan, 并在 Graphics API 列表中将 Vulkan 设置为最高优先级。如果您 使用 Unity 2021.1 或更低版本,这是使用 Vulkan 的唯一方式。

项目设置对话框。
图 4. 在 Unity 中手动选择 Vulkan 作为主图形 API。

使用 VkQuality Unity 引擎插件 ,在启动时提供图形 API 的建议,以供您的游戏使用 。

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

如需启用 Vulkan 图形 API,请依次前往 Project Settings >平台 > Android >构建并选择 Support Vulkan。如果您同时选择支持 Vulkan支持 OpenGL ES3.2 时,Unreal 默认使用 Vulkan。如果设备 不支持 Vulkan,Unreal 回退到 OpenGL ES 3.2。

项目设置对话框。
图 5. 在 Unreal Engine 中启用 Vulkan。

如果您使用的特定 Vulkan 功能已知在下列设备上行为不佳, 对于某些设备,您可以自定义BaseDeviceProfile.ini文件,以排除 这些设备请参阅自定义设备配置文件和可伸缩性 Android 版应用,了解如何 自定义 BaseDeviceProfile.ini。由于新的设备驱动程序之前可能会修复 请及时更新您的 BaseDeviceProfile.ini 文件,以获取所有 进行优化。

什么是 ADPF

Android 动态性能框架 (ADPF) 根据动态散热、CPU 和 GPU 管理功能优化游戏 。这些功能主要针对游戏,但您也可以使用这些功能 性能密集型应用

ADPF 是一组 API,可让游戏和性能密集型应用更为直接地与 Android 设备的电源和散热系统进行互动。包含 这些 API,您可以监控 Android 系统上的动态行为, 在不造成设备过热的可持续性水平上优化游戏性能。

以下是主要的 ADPF 功能:

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

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

将自适应功能集成到原生游戏中 Codelab 将指导您将 ADPF 功能集成到您的 游戏的详细步骤,您可以按照自己的节奏进行操作。在 您将集成以下功能:

  • Thermal API:监听设备热条件并在设备进入温控降频状态前做出反应。
  • Game Mode API:了解玩家优化偏好设置(最大限度地提高性能或节省电量)并相应地进行调整。
  • Game State API:让系统了解游戏的状态(正在加载、玩游戏、界面等),然后系统可以相应地调整资源(提升 I/O 或 CPU、GPU 等)。
  • Performance Hint API:告知系统您的线程模型和工作负载,以便系统相应地分配资源。

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

Unity 的自适应性能功能 针对移动设备优化游戏的开发者的工具, 尤其是多元化的 Android 生态系统借助自适应性能功能, 让游戏适应设备的性能和散热特性 确保玩家获得流畅高效的游戏体验。

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

项目设置对话框。
图 6. 在 Unity Engine 中集成了 ADPF。

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

项目设置对话框。
图 7. 在 Unreal Engine 中集成了 ADPF。
  1. 下载插件
  2. 将该插件复制到项目插件文件夹中
  3. 在 Unreal 编辑器中启用 ADPF Unreal Engine 插件
  4. 重新启动 Unreal 编辑器
  5. 制作和烹饪游戏

Android 动态性能框架(ADPF) 插件 针对 Unreal Engine 提供了 稳定的性能并防止温控调频。 下载插件 。此插件通过设置 Unreal 控制台值