Mir 2 通过使用 Frame Pacing 库来提升渲染性能

Mir 2: Return of the King 是 Actoz Soft 授权的优质《传奇》IP 移动游戏,由 HK ZHILI YAOAN LIMITED 使用 Unity 游戏引擎开发。

这款游戏不仅完美再现了韩国奇幻 MMORPG 代表作《Mir 2》的感觉,还提供了许多最热门的游戏内容,例如装备收集、大规模沙漠攻击和其他核心玩法。

该游戏使用了 Android Frame Pacing 库 (Swappy) 来提高帧速率的稳定性,实现流畅的渲染,并显著提升 Android Vitals(慢会话指标)的性能。

Android Vitals 推出了“慢会话”功能

慢会话是 Google Play 管理中心中的一项 Android Vitals 指标。慢会话是指慢帧占比超过 25% 的会话。如果某个帧存在以下情况,则认为该帧的呈现速度缓慢:

  1. 在 20fps 时,它不会在上一帧后 50 毫秒内呈现。

  2. 在 30fps 时,它不会在前一帧后 34 毫秒内呈现。

Play 会在适当情况下减少展示帧速率在用户手机上无法达到 20 FPS 的游戏。

导致某个帧在屏幕上显示或渲染的时间长于开发者的目标帧时间的原因有很多。游戏可能受 CPU 或 GPU 限制、过热(导致热节流),或者游戏的帧速率与设备的显示刷新率不匹配

什么是 Frame Pacing 库

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

如果设备支持多个刷新频率,该库就可以处理多个刷新频率,这提高了游戏呈现帧的灵活性。例如,对于支持 60 Hz 和 90 Hz 刷新频率的设备,游戏如果无法每秒生成 60 帧,可以下降到 45 FPS,而不是 30 FPS,以保持流畅度。该库会检测预期的游戏帧速率,并相应地自动调整帧呈现时间。

Frame Pacing 库还可以延长电池续航时间,因为它可以避免不必要的显示更新。例如,如果游戏以 60 FPS 的速度渲染,但显示屏以 120 Hz 的速度更新,则每帧都会更新屏幕两次。Frame Pacing 库通过将刷新率设置为设备支持且最接近目标帧速率的值来避免这种情况。

Mir 2 如何使用 Frame Pacing 库提升渲染性能

Mir 2 (미르 2: 왕의 귀환) 存在渲染性能不稳定的问题,在帧速率阈值为 20 FPS 时,有 40% 的会话速度缓慢,远高于 Google Play 的 20% 阈值。

图 1. 集成 Frame Pacing 库之前的慢会话指标。

Mir 2 (미르 2: 왕의 귀환) 是一款高保真图形游戏,部分设备在保持稳定的帧速率方面存在问题。其帧速率分布显示,许多会话的帧速率低于 20fps。

图 2. 集成 Frame Pacing 库之前游戏的 FPS 分布。
每个分桶表示有 75% 的帧比分桶标签更快的会话所占的百分比。

如果“显示工作负载”花费的时间比“应用工作负载”长,额外的帧将被添加至队列。这同样会导致出现卡顿现象,还可能会因缓冲区填充而导致帧额外延迟时间。

图 3. 长帧 B 导致两种帧(A 和 B)同步错误。

Frame Pacing 库使用同步栅栏(EGL_KHR_fence_syncVkFence)将 wait 注入应用,让显示流水线能够跟上进度,而不会积累背压,从而解决该问题。帧 A 仍然呈现一个额外的帧,但帧 B 现在可以正确呈现。

图 4. 帧 C 和 D 等待呈现。

Mir 2 利用 Unity 的内置优化帧同步功能轻松集成了 Frame Pacing 库。此举显著提升了其呈现性能,特别是将“慢速会话”指标从 40% 降至 10%

图 5. 集成 Frame Pacing 库后,会话速度缓慢。

集成该库后,Mir2 的慢速会话数量显著减少。

图 6. 集成帧同步后游戏的 FPS 分布。
每个分桶表示有 75% 的帧比分桶标签更快的会话所占的百分比。

Frame Pacing 库使用入门

如何在原生游戏引擎中使用帧同步库

请参阅以下指南,将 Android Frame Pacing 库集成到您的游戏中:

如何在 Unity 游戏引擎中使用帧同步库

Unity 已将 Android Frame Pacing 库集成到其引擎中。如需在 Unity 中启用此功能,请依次前往 Project Settings > Player > Settings for Android > Resolution and Presentation,然后勾选 Optimized Frame Pacing 复选框:

图 7. 在 Unity Engine 中启用 Frame Pacing。

或者,您也可以在逻辑代码中程序化地启用“优化帧同步”选项,以允许 Unity 均匀分配帧,从而减少帧速率的差异,打造更流畅的游戏体验。

如何在 Unreal 游戏引擎中使用 Frame Pacing 库

Unreal 4.25 及更高版本集成了 Android Frame Pacing 库,后者是 Android Game Development Kit 的一部分。移动设备帧同步一文介绍了如何启用 Android Frame Pacing 库,以及如何通过 C++ 代码控制帧同步。