このトピックでは、Tuning Fork ライブラリとも呼ばれる Android Performance Tuner を統合して、ネイティブ(C および C++)ゲームエンジンからのフレーム時間のデータを記録してアップロードする方法について説明します。
Unity ゲームエンジンについては、Unity のガイドをご覧ください。
背景
ゲーム エクスペリエンスの重要な要素は、レンダリング パフォーマンスです。レンダリング パフォーマンスは、次の 2 つの入力の結果です。
- フレームレート: フレームが描画される頻度。
- グラフィックの品質設定: フレームが表示される際の忠実度のレベル。グラフィックだけでなくシミュレーションの忠実度も含みます。
ゲームの場合、次のような場合にレンダリング パフォーマンスが高いと考えられます。
- 安定し一貫したフレームレート(目標の頻度でレンダリングされるフレームの割合)を提供している。
- 安定性を維持しつつ、可能な限り高い頻度でフレームをレンダリングしている(一般にゲームの種類に応じて 30 FPS または 60 FPS)。
- ユーザーに指定された画面サイズと密度で詳細レベルを最大化し、同時に安定して目標のフレームレートを達成している。
Android Frame Pacing ライブラリを使用すると、フレーム時間のばらつきを抑え、安定したフレームレートを実現できます。残されたフレーム時間のばらつきは、ゲームプレイの特定のシーンでの表示の詳細レベルと、デバイスのグラフィック能力によるものです。Android Performance Tuner を使うと、ゲームプレイ中にフレーム時間が目標より遅くなったり速くなったりした時間を特定し、その問題を以下の要因に関連付けることができます。
- 特定の品質設定
- ゲーム内の特定のシーン
- 特定のデバイスモデルまたはデバイス仕様
データの記録とアップロード
Tuning Fork ライブラリの機能は、Android Frame Pacing ライブラリがフレームごとにティック関数を呼び出すことで実現されます。ライブラリ内では、このティック情報がヒストグラムに集約され、HTTP エンドポイントを通じて定期的に Google Play にアップロードされます。各ティックは、プロトコル バッファ ファイルで指定する定義である、インストゥルメント キーとアノテーションに関連付けられて記録されます。
インストゥルメント キー
インストゥルメント キーは、そのティックがフレーム内のどこからのものかを示します。各ティック関数の呼び出しに渡す必要がある整数です。Android Frame Pacing ライブラリは、swappy_common.h
で定義済みのインストゥルメント キーを使用しています。Frame Pacing ライブラリを使用しない場合は、独自のインストゥルメント キーを定義することもできます。
アノテーション
アノテーションは、記録されたティックでのゲームの動作に関するコンテキスト情報を提供するものです。たとえば、アノテーションにより次のいずれかを識別できます。
- 現在のゲームレベル
- 「ビッグボス」の表示中
- その他のゲームの状態に関する情報
アノテーションは、com.google.tuningfork.Annotation
プロトコル バッファ メッセージによって定義されます。現在のアノテーションを設定するには、定義したメッセージをシリアル化したものを TuningFork_setCurrentAnnotation()
に渡します。別のアノテーションが設定されるまで、後続のすべてのティックデータがこのアノテーションに関連付けられます。アノテーションの proto 定義の例を次に示します。
import "tuningfork.proto"
enum Level {
INVALID_LEVEL = 0;
Level_1 = 1;
Level_2 = 2;
Level_3 = 3;
}
message Annotation {
optional Level level = 1;
}
忠実度パラメータ
忠実度パラメータは、メッシュの詳細レベル、テクスチャの解像度、アンチエイリアス方法など、ゲームのパフォーマンスやグラフィックの再現性に影響を与えます。アノテーションと同じように、忠実度パラメータは com.google.tuningfork.FidelityParams
プロトコル バッファ メッセージを使用して定義されます。忠実度パラメータの proto 定義の例を次に示します。
import "tuningfork.proto"
message FidelityParams {
int32 texture_quality_level = 1;
int32 shadow_resolution = 2;
float terrain_details_percent = 3;
int32 post_processing_effects_level = 4;
}
Tuning Fork の初期化時は、ゲームで使用するパラメータをシリアル化して渡します。たとえば、ユーザーがゲームのレンダリング設定を変更し、その後でアップロードされたデータが新しいパラメータに関連付けられている場合は、これらのパラメータを変更できます。
デベロッパーが定義するアノテーションと忠実度パラメータを Google Play で認識できるようにするには、それらの定義があるプロトコル バッファ ファイルを、初期設定とともにゲームの APK 内にバンドルする必要があります。また、Google Play UI でデータを区分するには、APK で忠実度パラメータの一般的な組み合わせのデフォルト値を指定する必要があります。詳細については、品質レベルを定義するをご覧ください。
メモリと CPU のオーバーヘッド
Tuning Fork ライブラリで使用されるすべてのメモリは、ゲームプレイ中に影響が発生しないように、初期化時に割り当てられます。データのサイズは、インストゥルメント キーの数、想定されるアノテーションの数、各ヒストグラムのバケット数によって異なります。各バケットのバイト数は、これらの個数の 4 倍になります。また、ダブルバッファ方式で送信できるように、すべてのヒストグラムは同じものが 2 つあります。
送信は別のスレッドで行われるため、これがティックの呼び出しをブロックすることはありません。アップロードに使用できる接続がない場合は、後でアップロードするために送信をキューに追加します。
ティック関数の呼び出しに、処理オーバーヘッドはほとんどありません。ヒストグラム バケットの配列へのインデックスを計算し、整数のカウントを増やすだけです。
Tuning Fork ライブラリを統合する
この統合ガイドは 2 つのパートに分かれています。最初のパートでは、デモアプリと Google Play Console を使用してエンドツーエンドのテストを実行する方法を説明します。次のパートでは、Tuning Fork ライブラリをデベロッパーのツールチェーンに統合する方法と、ライブラリによって提供される関数の使用方法について説明します。次へ進むには、以下の [次へ] をクリックしてください。