
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% しきい値を大幅に上回っていました。

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

各バケットは、フレームの 75% がバケットラベルよりも速かったセッションの割合を表します。
ディスプレイ ワークロードがアプリ ワークロードより長くかかると、追加フレームがキューに投入されます。これもまたスタッタリングを発生させ、バッファの詰め込みが原因で追加の遅延フレームを発生させる可能性があります。

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

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

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

各バケットは、フレームの 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] チェックボックスをオンにします。

または、ロジック コードで 最適化されたフレーム ペーシング オプションをプログラムで有効にして、Unity がフレームを均等に分散し、フレームレートのばらつきを抑えて、スムーズなゲームプレイを実現することもできます。
Unreal ゲームエンジンで Swappy を使用する方法
Unreal 4.25 以降には、Android Game Development Kit の一部である Android Frame Pacing Library が統合されています。Mobile Frame Pacing に関する記事では、Android Frame Pacing Library を有効にする方法と、C++ のコードからフレームペースを制御する方法について説明しています。
詳細については、速度の遅いセッションと Swappy をご覧ください。