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

「速度が遅いセッション」は、Google Play Console に新たに追加された Android Vitals の指標です。遅いセッションとは、25% を超えるフレームが遅いセッションです。前のフレームから 50 ミリ秒未満(20 FPS に相当)以内のフレームが表示されないと、速度が低下します。Android Vitals は、ターゲットが 34 ミリ秒(30 FPS に相当)の 2 つ目の「Slow Sessions」指標もレポートします。「速度が遅いセッション」を使用すると、ユーザーにとってゲームがどの程度滑らかで滑らかであるかに影響を与えるゲームのフレームレートのパフォーマンスを把握できます。

将来的には、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 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 ディスプレイ サブシステムは、ディスプレイ ハードウェアがアップデートの途中で新しいフレームに切り替えたときに発生する可能性がある視覚的なアーティファクト(テアリング)を回避するように設計されています。これらのアーティファクトを回避するために、ディスプレイ サブシステムは次の処理を行います。

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

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

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

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

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

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

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

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

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

Vulkan とは

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

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

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

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

Codelab Android での Vulkan スタートガイドの Codelab では、Vulkan レンダリング パイプラインを設定してから、テクスチャ付きの回転三角形を画面上にレンダリングする手順について説明しています。この Codelab を使用して、ゲーム グラフィックのレンダリング方法を学習します。

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

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

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

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

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

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

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

Vulkan グラフィック API を有効にするには、[Project Settings] > [Platforms] > [Android] > [Build] に移動し、[Support Vulkan] を選択します。[Support Vulkan] と [Support 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: Android がワークロードに適したパフォーマンス設定(CPU 動作点やコアなど)を選択できるように、パフォーマンスのヒントを提供します。
  • Game Mode API と Game State API: ユーザーの設定とゲーム固有の構成に基づいてパフォーマンスやバッテリー駆動時間の特性を優先することで、ゲームプレイの最適化を可能にします。
  • 固定パフォーマンス モード: ベンチマーク中にデバイスで固定パフォーマンス モードを有効にすると、動的な CPU クロックによって変更されない測定値を取得できます。
  • 省電力モード: パフォーマンスよりも電力効率を優先するように、Performance Hints セッションのスレッドを安全にスケジュールできることをセッションに伝えます。Android 15(API leve 35)で利用できます。

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

Codelab 適応性機能をネイティブ ゲームに統合するの Codelab では、自分のペースで進めることができる手順に沿って、ADPF 機能をゲームに統合する方法について説明しています。この Codelab の最後には、次の機能を統合します。

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

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

Unity のアダプティブ パフォーマンスは、モバイル デバイス、特に多様な Android エコシステム向けにゲームを最適化したいと考えているゲーム デベロッパー向けのツールです。アダプティブ パフォーマンスを使用すると、ゲームがデバイスのパフォーマンスと温度特性にリアルタイムで適応し、スムーズで効率的なゲーム エクスペリエンスを実現できます。

アダプティブ パフォーマンス Android プロバイダのガイドに沿って、Unity で ADPF を実装する手順をご確認ください。

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

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 console 値を設定することで機能を変更します。