Android ゲームの開発や最適化を行う際は、エンジンが使用しているグラフィック パイプラインを把握することが役立つことがよくあります。エンジンは、デベロッパーがアクセスできる明確なシグナルなしで Vulkan または GLES を選択することがあります。残念ながら、ゲームが Vulkan で実行されているか、OpenGL ES にサイレント フォールバックしているかを確認するために logcat に依存することが信頼できない場合があります。
このガイドでは、Android Performance Analyzer(APA)とカスタム Perfetto SQL クエリを使用して、ゲームのアクティブなレンダリング API を明確に特定する方法について説明します。
ログベースの検証の制限事項
- ストリップされたログ: 製品版ビルドでは、初期化とドライバ読み込みのフットプリントが非表示になることがよくあります。
- 誤検出: 一部のゲームエンジンは、起動時に Vulkan と OpenGL ES の両方のライブラリを読み込み、両方の初期化ログを出力します。これは、最終的に一方が失敗してフォールバックがトリガーされる場合でも同様です。
- サイレント フォールバック: デバイス固有のドライバの問題により Vulkan の初期化が失敗した場合、エンジンは重大なエラーをスローせずに OpenGL ES にフォールバックすることがよくあります。
APA を使用して測定する
Android Performance Analyzer を使用すると、システム トレースを記録し、SQL クエリを使用してフレームデータを正確に分析できます。Vulkan と GLES の使用状況を測定する手順は次のとおりです。
APA でトレースをキャプチャする: ゲームを実行し、APA を使用して、分析するセグメント(フレーム落ちが疑われるゲームプレイ中のポイントなど)のシステム トレースをキャプチャします。デバイスが接続され、トレースの記録が完了すると、トレースデータが APA インターフェースに読み込まれます。
APA の [SQL] タブをクリックする: トレース分析画面が開いているときに、UI のナビゲーション メニューで [SQL] タブをクリックして、トレース プロセッサ環境を開きます。ここで、データを直接クエリできます。
次の SQL クエリを APA SQL タブに貼り付けます。次の SQL クエリをコピーして、クエリ入力フィールドに貼り付けます。このクエリは、
eglSwapBuffers、QueuePresentKHR、vkQueuePresentKHRなどの描画 API イベントのトレースをスキャンします。プロセス名でグループ化し、レンダリング API の数と、Vulkan と OpenGL ES のレンダリング呼び出しの割合を計算します。WITH raw_slices AS ( -- 1. Map each slice (API call) to its corresponding process or package via UTID and UPID SELECT p.name AS process_name, s.name AS slice_name FROM slice s JOIN thread_track tt ON s.track_id = tt.id JOIN thread t USING (utid) JOIN process p USING (upid) WHERE (s.name LIKE 'eglSwapBuffers%' OR s.name IN ('QueuePresentKHR', 'vkQueuePresentKHR')) -- Optional: To isolate your game, uncomment the following and filter by package name and thread name: -- AND p.name = 'com.example.mygame' -- AND t.name = 'RenderThread' ), process_stats AS ( -- 2. Aggregate counts per individual process SELECT process_name, SUM(CASE WHEN slice_name LIKE 'eglSwapBuffers%' THEN 1 ELSE 0 END) AS egl_count, SUM(CASE WHEN slice_name IN ('QueuePresentKHR', 'vkQueuePresentKHR') THEN 1 ELSE 0 END) AS vulkan_count FROM raw_slices GROUP BY process_name ), process_totals AS ( -- 3. Calculate total counts for denominator calculation SELECT process_name, egl_count, vulkan_count, (egl_count + vulkan_count) AS total_count FROM process_stats ) -- 4. Calculate final percentage shares per row, preventing division by zero errors SELECT process_name, egl_count, vulkan_count, total_count, ROUND(CAST(egl_count AS REAL) * 100 / NULLIF(total_count, 0), 2) AS "egl_percentage(%)", ROUND(CAST(vulkan_count AS REAL) * 100 / NULLIF(total_count, 0), 2) AS "vulkan_percentage(%)" FROM process_totals ORDER BY total_count DESC;クエリを実行する: 入力フィールドの近くにある [クエリを実行] ボタンをクリックします。クエリが実行されると、結果ペインにテーブルが表示されます。このテーブルには、プロセス名(
process_name)、OpenGL ES のプレゼンテーション数(egl_count)、Vulkan のプレゼンテーション数(vulkan_count)、プレゼンテーションの合計数(total_count)、使用された各 API の割合(egl_percentage(%)とvulkan_percentage(%))が表示されます。
実行された SQL クエリと、結果として得られたレンダリング API 指標が表に表示されている画面
主な注意点
SurfaceFlingerの混同を避ける: 常にゲームのアプリケーション スレッド(RenderThread)を検索範囲にしてください。SurfaceFlingerなどのシステム全体のコンポジタ プロセスでは、ゲームの内部レンダリング パイプラインではなく、システム UI レンダリングを表す Vulkan トラックまたは EGL トラックが表示されることがあります。ゲームを分離するには、メインの SQL クエリのWHERE句にあるオプションのフィルタのコメント化を解除し、'com.example.mygame'をゲームのパッケージ名に置き換えます。-- AND p.name = 'com.example.mygame' -- AND t.name = 'RenderThread'ウォームアップ期間: トレースは、ゲームのメイン 3D シーンが完全に読み込まれた後に記録します。スプラッシュ画面や読み込み遷移中にキャプチャすると、初期化が誤って行われる可能性があります。
LevelUp の免除トレースの要件
Android Performance Analyzer(APA)を使用してトレースをキャプチャし、Google Play Games LevelUp の免除を受けるには、トレースが有効になるための特定のハードウェア要件があります。
トレースのキャプチャには、対象となる Level Up 参照デバイスのいずれかを使用することを強くおすすめします。
さらに、正確な検証を行うには、ANGLE GPU を使用するデバイスでトレースを取得しないでください。具体的には、次のデバイスを使用して LevelUp exemption トレースをキャプチャすることはできません。
- GPU ベンダーが SLSI(Samsung)で、AMD Xclipse GPU を使用しているデバイス
- Google Pixel 11