《传奇2》通过使用帧同步库提高渲染性能

《传奇2:王者归来》

《传奇2:王者归来》是一款由 Actoz Soft 授权,HK ZHILI YAOAN LIMITED 使用 Unity 游戏引擎开发的高品质传奇 IP 手机游戏。

这款游戏不仅完美复刻了韩国奇幻 MMORPG 经典之作《传奇2》的情怀,还提供了许多最受欢迎的游戏内容,例如装备收集、大型沙巴克攻城战等核心玩法。

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

缓慢会话在 Android vitals 上线

缓慢会话是 Google Play 管理中心中的一项 Android vitals 指标。缓慢会话是指慢帧数占比超过 25% 的会话。如果出现以下情况,则帧为慢帧:

  1. 在 20fps 时,它未在前一帧之后 50 毫秒内显示。

  2. 在 30fps 时,它未在前一帧之后 34 毫秒内显示。

假以时日,Play 将开始引导用户避开那些在手机上无法达到 20 FPS 的游戏。

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

什么是帧同步库

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

如果设备支持多种刷新率,该库会对其进行处理,从而使游戏在呈现帧时更具灵活性。例如,对于支持 60 Hz 和 90 Hz 刷新率的设备,无法达到每秒 60 帧的游戏可以降至 45 FPS 而不是 30 FPS,以保持流畅。该库会检测预期的游戏帧率,并相应地自动调整帧呈现时间。

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

《传奇2》如何通过帧同步库提升渲染性能

《传奇2》(미르2: 왕의 귀환)曾面临渲染性能不稳定的问题,在 20 FPS 帧率阈值下,其慢会话比例高达 40%,远高于 Google Play 20% 的阈值。

图 1. 集成帧同步库之前的慢会话指标。

《传奇2》(미르2: 왕의 귀환)是一款高保真图形游戏,某些设备在维持稳定 FPS 方面面临挑战。其帧率分布显示,许多会话的 FPS 低于 20fps。

图 2. 集成帧同步库之前的游戏 FPS 分布。
每个分区代表会话的百分比,其中 75% 的帧速度快于该分区的标签。

当显示器工作负载长于应用工作负载时,额外的帧会被添加到队列中。这再次导致卡顿,并且还可能由于缓冲区填充而导致额外的帧延迟。

图 3. 长帧 B 导致帧 A 和帧 B 的同步不正确。

帧同步库通过使用同步栅栏(EGL_KHR_fence_syncVkFence)来解决此问题,即向应用注入等待,以便显示管线能够跟上,而不是允许背压积聚。帧 A 仍然会呈现额外的帧,但帧 B 现在可以正确呈现。

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

《传奇2》通过利用 Unity 内置的优化帧同步功能,轻松集成了帧同步库。此举显著改善了其渲染性能,特别是将慢会话指标从 40% 降至 10%

图 5. 集成帧同步库后慢会话的改善。

《传奇2》在集成该库后,慢会话的数量显著减少。

图 6. 集成帧同步后游戏的 FPS 分布。
每个分区代表会话的百分比,其中 75% 的帧速度快于该分区的标签。

帧同步库入门

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

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

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

Unity 已将 Android 帧同步库集成到其引擎中。要在 Unity 中启用此功能,请在 Project Settings > Player > Settings for Android > Resolution and Presentation 下勾选 Optimized Frame Pacing 复选框。

图 7. 在 Unity 引擎中启用帧同步。

或者,您也可以在逻辑代码中以编程方式启用 优化帧同步选项,让 Unity 均匀分布帧以减少帧率波动,从而实现更流畅的游戏体验。

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

Unreal 4.25 及更高版本集成了 Android 帧同步库,该库是 Android 游戏开发套件的一部分。移动帧同步文章介绍了如何启用 Android 帧同步库以及如何通过 C++ 代码控制帧同步。