速度が遅いセッション(ゲームのみ)

速度の遅いセッションは、Google Play Console の新しい Android Vitals 指標です。速度の遅いセッションとは、25% を超えるフレームの速度が遅いセッションです。前のフレームから 50 ミリ秒以内に表示されない(20 FPS 相当)フレームは、速度が遅いとみなされます。Android Vitals には、34 ms(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 ms ~ 1, 000 ms の値の合計)÷ totalFrames x 100

    totalFrames = 274
    ...
    presentToPresent histogram is as below:
    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)VulkanADPF を使用して、これらの問題に対処し、ゲームのパフォーマンスを改善します。

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 以降でこの機能を有効にするには、[Project Settings] > [Player] > [Settings][Android] > [Resolution and Presentation] で [Optimized Frame Pacing] チェックボックスをオンにします。

プロジェクト設定ダイアログ。
図 2. Unity Engine で Frame Pacing を有効にする。

または、ロジックコードで 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++ のコードからフレームペースを制御する方法について説明しています。

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 を構成します。

プロジェクト設定ダイアログ。
図 3. Unity Auto Graphics API を有効にします。

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

プロジェクト設定ダイアログ。
図 4. Unity でメインのグラフィック API として Vulkan を手動で選択します。

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

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

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

プロジェクト設定ダイアログ。
図 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: ワークロードに適したパフォーマンス設定(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 Android プロバイダでは、Unity で ADPF を実装する手順について説明します。

プロジェクト設定ダイアログ。
図 6. ADPF を Unity Engine に統合。

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

プロジェクト設定ダイアログ。
図 7. Unreal Engine に ADPF を統合します。
  1. プラグインをダウンロードします。
  2. プラグインをプロジェクトのプラグイン フォルダにコピーする
  3. Unreal エディタで ADPF Unreal Engine プラグインを有効にする
  4. Unreal エディタを再起動する
  5. ゲームをビルドしてクックする

Unreal Engine 用の Android Dynamic Performance Framework(ADPF)プラグインは、安定したパフォーマンスを提供し、サーマル スロットリングを防ぎます。GitHub からプラグインをダウンロードします。このプラグインは、Unreal コンソールの値を設定して機能を変更します。