“慢会话”是 Google Play 管理中心内新增的一项 Android Vitals 指标。慢 会话是指有超过 25% 的帧呈现速度缓慢的会话。框架 如果它没有在上一帧之后的 50 毫秒内呈现,则认为该帧的呈现速度缓慢 (相当于 20 FPS)。Android Vitals 还会报告第二次“慢会话” 目标为 34 毫秒(相当于 30 FPS)的指标。使用“慢会话”时 您游戏的帧速率性能 能给用户带来流畅自然的体验
Play 会在适当情况下开始引导用户避开无法 可以在手机上达到 20 FPS。请注意,Android Vitals 仅开始监控 帧速率的变化。
如需了解详情,请访问我们的帮助中心 该指标
![饼图类图形,显示慢帧和非慢帧的数量。](https://developer.android.google.cn/static/topic/performance/vitals/images/slow-session.png?hl=ca)
如何衡量 FPS 和检测慢帧
Android dumpsys surfaceflinger timestats
命令提供平均 FPS 和
呈现到展示的所有层的时间直方图,
。帧的“呈现到呈现”时间是指
正在绘制的当前帧和上一帧。以下是
按步骤使用该命令收集游戏的 FPS:
运行带有
enable
和clear
标志的命令以开始捕获数据 信息:adb shell dumpsys SurfaceFlinger --timestats -clear -enable
游戏玩了足够长的时间后,使用以下代码再次运行该命令: 标志
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 ...
收集完所有信息后,您应该停用 通过使用标志
disable
来提取时间统计信息:adb shell dumpsys SurfaceFlinger --timestats -disable
呈现速度缓慢的原因和解决方案
有很多原因可能会导致帧在屏幕上呈现或呈现更长时间 高于开发者的目标游戏可能受限于 CPU/GPU。或 设备过热并进入节流热状态。或 游戏的帧速率和设备的显示不一致 刷新率。
使用 Android Frame Pacing (Swappy)。 Vulkan 和 ADPF 从而解决这些问题,提升游戏性能
什么是 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 > 设置分辨率和呈现效果:
![项目设置对话框。](https://developer.android.google.cn/static/topic/performance/vitals/images/unity-frame-pacing.png?hl=ca)
或者,您也可以以编程方式在逻辑代码中启用 Optimized Frame Pacing 选项,以允许 Unity 均匀地加载 分布帧以减少帧速率差异,从而打造更流畅的游戏体验。
如何在 Unreal 游戏引擎中使用 Swappy
Unreal 4.25 及更高版本集成了 Android Frame Pacing 库,该库是 Android Game Development Kit。Mobile 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。
![项目设置对话框。](https://developer.android.google.cn/static/topic/performance/vitals/images/unity-vulkan.png?hl=ca)
或者,您也可以通过停用 Auto Graphics API 来手动启用 Vulkan, 并在 Graphics API 列表中将 Vulkan 设置为最高优先级。如果您 使用 Unity 2021.1 或更低版本,这是使用 Vulkan 的唯一方式。
![项目设置对话框。](https://developer.android.google.cn/static/topic/performance/vitals/images/unity-vulkan-2.png?hl=ca)
使用 VkQuality Unity 引擎插件 ,在启动时提供图形 API 的建议,以供您的游戏使用 。
如何在 Unreal 游戏引擎中使用 Vulkan
如需启用 Vulkan 图形 API,请依次前往 Project Settings >平台 > Android >构建并选择 Support Vulkan。如果您同时选择支持 Vulkan 和支持 OpenGL ES3.2 时,Unreal 默认使用 Vulkan。如果设备 不支持 Vulkan,Unreal 回退到 OpenGL ES 3.2。
![项目设置对话框。](https://developer.android.google.cn/static/topic/performance/vitals/images/unreal-vulkan.png?hl=ca)
如果您使用的特定 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 的步骤。
![项目设置对话框。](https://developer.android.google.cn/static/topic/performance/vitals/images/unity-adpf.png?hl=ca)
如何在 Unreal 游戏引擎中使用 ADPF
![项目设置对话框。](https://developer.android.google.cn/static/topic/performance/vitals/images/unreal-adpf.png?hl=ca)
Android 动态性能框架(ADPF) 插件 针对 Unreal Engine 提供了 稳定的性能并防止温控调频。 下载插件 。此插件通过设置 Unreal 控制台值。