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

速度の遅いセッションとは、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 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] for Android > Resolution and Presentation で [Optimized Frame Pacing] チェックボックスをオンにします。

[プロジェクト設定] ダイアログ。
図 2. Unity Engine でフレーム ペーシングを有効にします。

または、ロジックコードで最適化されたフレーム ペーシング オプションをプログラムで有効にして、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 でデバイスの自動選択を有効にするには、自動グラフィック API を構成する手順に沿って操作します。

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

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

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

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

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

Vulkan グラフィック API を有効にするには、[Project Settings](プロジェクト設定)> [Platforms](プラットフォーム)> [Android] > [Build](ビルド)に移動し、[Support Vulkan](Vulkan をサポート)を選択します。[Support Vulkan](Vulkan をサポート)[Support OpenGL ES3.2](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 パフォーマンス ヒント 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 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 コンソール値を設定することで機能を変更します。