Mir 2 で Frame Pacing ライブラリを使用してレンダリング パフォーマンスを改善

Mir 2: Return of the King は、Actoz Soft がライセンスを付与し、HK ZHILI YAOAN LIMITED が Unity ゲームエンジンを使用して開発した、高品質の Legend IP モバイルゲームです。

このゲームは、韓国のファンタジー MMORPG を代表する「Mir 2」の雰囲気を完璧に再現しているだけでなく、装備の収集、大規模な砂攻撃などのコア ゲームプレイなど、最も人気のあるゲーム コンテンツも数多く提供しています。

このゲームでは、Android の Frame Pacing ライブラリ(Swappy)を使用して、フレームレートの安定性を改善し、スムーズなレンダリングを実現し、Android Vitals(速度の遅いセッション指標)を大幅に改善しました。

Android Vitals で速度が遅いセッションがリリースされました

速度の遅いセッションは、Google Play Console の Android Vitals 指標です。速度の遅いセッションでは、25% を超えるフレームの速度が遅くなります。フレームで速度が低下しているとは、次のいずれかであるということです。

  1. 20 fps では、前のフレームから 50 ミリ秒以内に表示されません。

  2. 30 fps では、前のフレームから 34 ミリ秒以内に表示されません。

将来的に、Google Play は、スマートフォンで 20 FPS を達成できないゲームが選択されないようにする予定です。

フレームがデベロッパーのターゲット フレーム時間よりも長く画面に表示またはレンダリングされる理由はさまざまです。ゲームが CPU または GPU に依存している、過熱している(サーマル スロットリングが発生している)、ゲームのフレームレートとデバイスのディスプレイのリフレッシュ レートが一致していない可能性があります。

Frame Pacing ライブラリとは

Swappy という名前でも知られる Android Frame Pacing ライブラリは、AGDK ライブラリの一部です。Swappy を使用すると、OpenGL と Vulkan のゲームで Android 上でスムーズなレンダリングと正しいフレーム ペーシングを実現できます。

デバイスで複数のリフレッシュ レートがサポートされている場合は、ライブラリでそれらが処理されるため、ゲームはより柔軟にフレームを表示できます。たとえば、60 Hz と 90 Hz のリフレッシュ レートをサポートするデバイスの場合、60 FPS(フレーム毎秒)のレートを達成できないゲームは、スムーズな表示を維持するために 30 FPS ではなく 45 FPS にレートを下げることができます。ライブラリは、期待されるゲームのフレームレートを検出し、それに応じてフレームの表示時間を自動調整します。

また、Frame Pacing ライブラリは、不要なディスプレイの更新を回避するため、バッテリー駆動時間も改善されます。たとえば、ゲームが 60 FPS でレンダリングされていて、ディスプレイが 120 Hz で更新されている場合、画面はフレームごとに 2 回更新されます。Frame Pacing ライブラリは、リフレッシュ レートを目標フレームレートに最も近いデバイスでサポートされている値に設定することで、この問題を回避します。

Mir 2 が Frame Pacing ライブラリでレンダリング パフォーマンスを改善した方法

Mir 2(미르 2: 왕의 귀환)で、レンダリング パフォーマンスの不安定さに関する問題が発生していました。フレームレートしきい値が 20 FPS で、40% のセッションが遅い状態となり、Google Play の 20% しきい値を大幅に上回っていました。

図 1. Frame Pacing ライブラリを統合する前の遅いセッション指標

Mir 2(미르 2: 왕의 귀환)は高忠実度のグラフィック ゲームであるため、一部のデバイスでは安定した FPS を維持することが困難です。フレームレートの分布を見ると、多くのセッションが 20 FPS 未満の FPS で実行されていることがわかります。

図 2. Frame Pacing ライブラリを統合する前のゲームの FPS 分布。
各バケットは、フレームの 75% がバケットラベルよりも速かったセッションの割合を表します。

ディスプレイ ワークロードがアプリ ワークロードより長くかかると、追加フレームがキューに投入されます。これもまたスタッタリングを発生させ、バッファの詰め込みが原因で追加の遅延フレームを発生させる可能性があります。

図 3. 長いフレーム B が 2 つのフレーム(A と B)で不正確なペーシングを生じさせる。

Frame Pacing ライブラリは、同期フェンス(EGL_KHR_fence_syncVkFence)を使用して、バック プレッシャーを増大させるのではなく、ディスプレイ パイプラインが追いつけるように待機をアプリに注入することで、この問題を解決します。フレーム A は依然として追加フレームを表示しますが、フレーム B は正しく表示されるようになります。

図 4. フレーム C とフレーム D が表示を待機します。

Mir 2 では、Unity の組み込みの Optimized Frame Pacing 機能を活用することで、Frame Pacing ライブラリを簡単に統合しました。この措置により、レンダリング パフォーマンスが大幅に改善されました。特に、遅いセッションの指標が 40% から 10% に低下しました。

図 5. Frame Pacing ライブラリの統合後のセッションの遅延の改善。

ライブラリを統合した後、Mir2 の遅いセッション数が大幅に減少しました。

図 6. フレーム ペーシングを統合した後のゲームの FPS 分布。
各バケットは、フレームの 75% がバケットラベルよりも速かったセッションの割合を表します。

Frame Pacing ライブラリのスタートガイド

ネイティブ ゲームエンジンで 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 Game Development Kit の一部である Android Frame Pacing Library が統合されています。Mobile Frame Pacing に関する記事では、Android Frame Pacing Library を有効にする方法と、C++ のコードからフレームペースを制御する方法について説明しています。