速度の遅いセッション

Android Vitals では、25% を超えるフレームの速度が遅いセッションを、速度の遅いセッションと見なします。前のフレームから 50 ミリ秒(20 FPS 相当)以内に表示されないフレームは、速度が遅いとみなされます。Android Vitals では、34 ミリ秒(30 FPS に相当)を目標とする 2 つ目の速度が遅いセッションの指標もレポートされます。「速度の遅いセッション」から、ユーザーにとってゲームがどのくらいスムーズな動きや快適な使用感を実現しているかに影響する、ゲームのフレームレートのパフォーマンスを把握できます。

将来的に、Google Play は、スマートフォンで 20 FPS を達成できないゲームが選択されないようにする予定です。Android Vitals によるフレームレートのモニタリングは、ゲームの実行時間が 1 分を過ぎた後で開始されます。

この指標について詳しくは、ヘルプセンターをご覧ください。

低速フレームと低速でないフレームの数を示す円グラフのようなグラフィック。
図 1. Android Vitals での速度が遅いセッション。

FPS を測定して速度の遅いフレームを検出する方法

Android の dumpsys SurfaceFlinger --timestats コマンドは、レンダリングされているすべてのレイヤの平均 FPS と表示から表示までのタイミング ヒストグラムを提供します。フレームの表示から表示までの時間は、現在のフレームと前のフレームが描画される間隔です。このコマンドを使用してゲームの FPS を収集する手順は次のとおりです。

  1. enable フラグと clear フラグを指定してコマンドを実行し、情報のキャプチャを開始します。

    adb shell dumpsys SurfaceFlinger --timestats -clear -enable
    
  2. ゲームを十分にプレイしたら、フラグ dump を指定してコマンドを再度実行し、情報をダンプします。

    adb shell dumpsys SurfaceFlinger --timestats -dump
    

    ダンプされた情報には、SurfaceFlinger によってレンダリングされたすべてのレイヤの合計フレーム数と presentToPresent ヒストグラムが含まれます。layerName に基づいてフィルタリングし、ゲームのセクションを見つける必要があります。

    layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833
    

    各レイヤの情報に基づいて、セッションのスロー フレームレートを計算できます。

    たとえば、20 FPS の低速フレームの割合 = (54 ミリ秒から 1, 000 ミリ秒までの値の合計)÷ totalFrames × 100

    totalFrames = 274
    ...
    presentToPresent histogram:
    0ms=0 1ms=0 2ms=0 3ms=0 4ms=0 5ms=0 6ms=0 7ms=0 8ms=0 9ms=0 10ms=0 11ms=0 12ms=0
    13ms=0 14ms=0 15ms=0 16ms=1 17ms=0 18ms=0 19ms=0 20ms=0 21ms=0 22ms=0 23ms=0
    24ms=0 25ms=0 26ms=0 27ms=0 28ms=0 29ms=0 30ms=0 31ms=0 32ms=0 33ms=269 34ms=0
    36ms=0 38ms=0 40ms=0 42ms=0 44ms=0 46ms=0 48ms=0 50ms=1 54ms=0 58ms=0 62ms=0
    66ms=0 70ms=1 74ms=0 78ms=0 82ms=0 86ms=0 90ms=0 94ms=0 98ms=0 102ms=0 106ms=0
    110ms=0 114ms=0 118ms=0 122ms=0 126ms=0 130ms=0 134ms=0 138ms=0 142ms=0 146ms=0
    150ms=0 200ms=0 250ms=0 300ms=0 350ms=0 400ms=0 450ms=0 500ms=0 550ms=0 600ms=0
    650ms=0 700ms=0 750ms=0 800ms=0 850ms=0 900ms=0 950ms=0 1000ms=0
    

    各レイヤの平均 FPS もダンプに表示されます。

    ...
    averageFPS = 30.179
    ...
    
  3. すべての情報を収集したら、disable フラグを使用して timestats を無効にします。

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

フレームが遅い原因と解決策

フレームがターゲットよりも長く画面に表示またはレンダリングされる理由はさまざまです。ゲームが CPU または GPU にバインドされている、デバイスが過熱してスロットルされたサーマル状態が有効になっている、ゲームのフレームレートとデバイスのディスプレイのリフレッシュ レートが一致していない、などの原因が考えられます。

Android Frame Pacing(Swappy)、Vulkan、ADPF を使用して、これらの問題に対処し、ゲームのパフォーマンスを向上させます。

Swappy とは

Swappy という名前でも知られる Android Frame Pacing ライブラリは、AGDK ライブラリの一部です。Swappy は、OpenGL と Vulkan のゲームが Android でスムーズなレンダリングと正確なフレーム ペーシングを行えるようにサポートします。

フレーム ペーシングとは、ゲームのロジックおよびレンダリング ループを、OS のディスプレイ サブシステムおよび基盤となるディスプレイ ハードウェアと同期させることです。Android ディスプレイ サブシステムは、ディスプレイ ハードウェアが更新の途中で新しいフレームに切り替わるときに発生する視覚的アーティファクト(テアリング)を回避するように設計されています。これらのアーティファクトを回避するため、ディスプレイ サブシステムは次の処理を行います。

  • 過去のフレームを内部的にバッファリングします。
  • 遅延しているフレーム送信を検出します。
  • 遅延フレームが検出されたときに、過去のフレームの表示を繰り返します。

Mir 2 が Swappy を使用してスロー セッション レートを 40% から 10% に削減した方法をご覧ください。

ネイティブ プロジェクトで Swappy を使用する方法

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

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

Unity は、Android Frame Pacing をエンジンに統合しています。Unity 2019.2 以上でこの機能を有効にするには、[プロジェクト設定] > [Player] > [Settings] を選択して、[Android] > [Resolution and Presentation] の [Optimized Frame Pacing] チェックボックスをオンにします。

[Optimized Frame Pacing] チェックボックスが表示されている Unity の [プロジェクト設定] ウィンドウ。
図 2. Unity Engine で Frame Pacing を有効にします。

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

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

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

Vulkan とは

Vulkan は、デバイスのグラフィック ハードウェアとゲームの間の抽象化を最小限に抑えるために設計された最新のクロス プラットフォーム 3D グラフィック API です。Vulkan は Android の主要な低レベル グラフィック API であり、OpenGL ES に代わるものです。OpenGL ES は Android で引き続きサポートされますが、機能の開発は行われなくなります。

Vulkan には OpenGL ES に比べて次のような利点があります。

  • グラフィック ドライバでの CPU オーバーヘッドが低減された、より効率的なアーキテクチャ
  • CPU パフォーマンスを向上させる新しい最適化戦略
  • OpenGL ES では利用できない新しいグラフィック機能(バインドレス API やレイ トレーシングなど)

ネイティブ Android プロジェクトで Vulkan を使用する方法

Android での Vulkan のスタートガイド Codelab では、Vulkan レンダリング パイプラインをセットアップし、テクスチャが適用された回転する三角形を画面にレンダリングする手順を説明しています。Codelab を使用して、ゲーム グラフィックをレンダリングする方法を学習します。

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

Unity でデバイスの自動選択を有効にするには、Auto Graphics API を構成する手順に沿って操作します。

[Auto Graphics API] が有効になっている Unity の [プロジェクト設定] ウィンドウ。
図 3. Unity Auto Graphics API を有効にします。

または、[Auto Graphics API] を無効にして Vulkan を手動で有効にし、[Graphics APIs] リストで Vulkan を最優先に設定することもできます。Unity 2021.1 以前のバージョンを使用している場合、Vulkan を使用するにはこの方法しかありません。

[Graphics APIs] リストで Vulkan が優先されている Unity の [プロジェクト設定] ウィンドウ。
図 4. Unity で Vulkan をメインのグラフィック API として手動で選択します。

VkQuality Unity エンジン プラグインを使用して、特定のデバイスで使用するゲームのグラフィック API の起動時の推奨事項を提供します。

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

Vulkan グラフィック API を有効にするには、[プロジェクト設定] > [Platforms] > [Android] > [Build] に移動し、[Support Vulkan] を選択します。[Support Vulkan] と [Support OpenGL ES3.2] の両方を選択すると、Unreal はデフォルトで Vulkan を使用します。デバイスが Vulkan をサポートしていない場合、Unreal は OpenGL ES 3.2 にフォールバックします。

[Support Vulkan] オプションが表示されている Unreal Engine の [プロジェクト設定] ウィンドウ。
図 5. Unreal Engine で Vulkan を有効にします。

特定のデバイスで動作が不安定になることがわかっている Vulkan の特定の機能を使用している場合は、BaseDeviceProfile.ini ファイルをカスタマイズして、それらのデバイスを除外できます。BaseDeviceProfile.ini をカスタマイズする方法については、Android 向けデバイス プロファイルとスケーラビリティのカスタマイズをご覧ください。新しいデバイス ドライバによって、以前に判明した不良デバイスが修正される可能性があるため、BaseDeviceProfile.ini ファイルを最新の状態に保ち、すべての最適化を取得してください。

ADPF とは

Android Dynamic Performance Framework(ADPF)は、Android の動的な温度、CPU、GPU の管理機能に基づいてゲームを最適化します。対象はゲームですが、この機能は高いパフォーマンスを必要とする他のアプリにも使用できます。

ADPF は、ゲームや高いパフォーマンスを必要とするアプリが Android デバイスの電力システムや温度システムをより直接的に操作できるようにする API のセットです。これらの API を使用することで、Android システムでの動的な動作をモニタリングし、デバイスを過熱状態にしない持続可能なレベルでゲームのパフォーマンスを最適化することができます。

ADPF の主な機能は次のとおりです。

  • Thermal API: デバイスの温度状態をモニタリングして、持続できなくなる前にアプリケーションがワークロードを事前に調整できるようにします。
  • CPU Performance Hint API: パフォーマンスのヒントを提供することで、Android がワークロードに適したパフォーマンス設定(CPU 動作ポイントやコアなど)を選択できるようにします。
  • Game Mode API と Game State API: ユーザー設定やゲーム固有の構成に基づいてパフォーマンスやバッテリー寿命などの特性に優先順位を付けることで、ゲームプレイの最適化を可能にします。
  • 固定パフォーマンス モード: ベンチマークの際にデバイスで固定パフォーマンス モードを有効にし、動的な CPU クロック設定によって変動することのない測定値を取得します。
  • 電力効率モード: パフォーマンス ヒント セッションのスレッドを、パフォーマンスよりも電力効率を優先して安全にスケジュールできることをセッションに示します。Android 15(API レベル 35)で利用できます。

ネイティブ Android プロジェクトで ADPF を使用する方法

適応性機能をネイティブ ゲームに統合する Codelab では、ADPF 機能をゲームに統合する手順を自分のペースで進めることができます。この Codelab を完了すると、次の機能が統合されます。

  • Thermal API: デバイスの温度状態をリッスンし、デバイスが温度スロットリング状態になる前に対応します。
  • Game Mode API: プレーヤーの最適化設定(パフォーマンスの最大化またはバッテリーの節約)を把握し、それに応じて調整します。
  • Game State API: ゲームの状態(読み込み中、プレイ中、UI など)をシステムに知らせ、システムがそれに応じてリソース(I/O、CPU、GPU など)を調整できるようにします。
  • Performance Hint API: スレッドモデルとワークロードをシステムに伝え、システムがそれに応じてリソースを割り当てられるようにします。

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

Unity の Adaptive Performance は、モバイル デバイス(特に多様な Android エコシステム)でゲームを最適化したいゲーム デベロッパー向けのツールです。Adaptive Performance を使用すると、ゲームをデバイスのパフォーマンスと温度特性にリアルタイムで適応させ、スムーズで効率的なゲーム体験を実現できます。

Adaptive Performance Android プロバイダでは、Unity で ADPF を実装する手順を説明しています。ADPF Unity Adaptive Performance と Android プロバイダもご覧ください。

Unity の [プロジェクト設定] ウィンドウに、Adaptive Performance Android プロバイダの設定が表示されている。
図 6. Unity Engine に ADPF を統合する。

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

Android Dynamic Performance Framework プラグインが表示されている Unreal Engine の [Plugins] ウィンドウ。
図 7. Unreal Engine に ADPF を統合する。
  1. プラグインをダウンロードします。
  2. プラグインをプロジェクトのプラグイン フォルダにコピーします。
  3. Unreal エディタで ADPF Unreal Engine プラグインを有効にします。
  4. Unreal エディタを再起動します。
  5. ゲームをビルドしてクックします。

Unreal Engine 用の Android Dynamic Performance Framework(ADPF)プラグインは、安定したパフォーマンスを提供し、サーマル スロットリングを防止します。GitHub からプラグインをダウンロードします。このプラグインは、Unreal コンソール値を設定することで機能を変更します。詳細については、ADPF Unreal Engine プラグインをご覧ください。