Mir 2 で Swappy を使用してレンダリング パフォーマンスを改善

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

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

このゲームでは、Android Frame Pacing API(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 に依存している、過熱によりサーマル スロットリング状態が有効になっている、ゲームのフレームレートとデバイスのディスプレイの更新レートが一致していない可能性があります。

Swappy とは

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 が Swappy でレンダリング パフォーマンスを改善した方法

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

図 1. Swappy を統合する前のスローセッション指標

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

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

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

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

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

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

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

図 5. Swappy を統合した後のセッションの遅延の改善。

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

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

Swappy を使ってみる

ネイティブ ゲームエンジンで Swappy を使用する方法

Android Frame Pacing ライブラリをゲームに統合する方法については、以下のガイドをご覧ください。

Unity ゲームエンジンで Swappy を使用する方法

Unity では、エンジンに Android Frame Pacing が統合されています。Unity でこの機能を有効にするには、[Project Settings] > [Player] > [Settings for Android] > [Resolution and Presentation] で [Optimized Frame Pacing] チェックボックスをオンにします。

図 7. Unity Engine で Frame Pacing を有効にする。

または、ロジック コードで 最適化されたフレーム ペーシング オプションをプログラムで有効にして、Unity がフレームを均等に分散し、フレームレートのばらつきを抑えて、スムーズなゲームプレイを実現することもできます。

Unreal ゲームエンジンで Swappy を使用する方法

Unreal 4.25 以降には、Android Game Development Kit の一部である Android Frame Pacing Library が統合されています。Mobile Frame Pacing に関する記事では、Android Frame Pacing Library を有効にする方法と、C++ のコードからフレームペースを制御する方法について説明しています。

詳細については、速度の遅いセッションSwappy をご覧ください。