デバッガ
検証レイヤによるデバッグ
Vulkan は高パフォーマンスを実現し、ドライバのオーバーヘッドを低減するように設計されています。これを実現するために、デフォルトでは非常に限定されたエラーチェック機能とデバッグ機能のみが含まれています。なんらかの問題を行うと、ドライバがエラーコードを返さずにクラッシュすることがよくあります。さらに悪いことに、グラフィック カードでは動作しているように見えても、他のドライバでは完全に機能しない場合もあります。
Vulkan は、開発中の広範なチェックを可能にするために、API とグラフィック ドライバの間に挿入できるコード断片である検証レイヤを備えています。これにより、関数パラメータの追加チェックやメモリ管理の問題の追跡などを行えます。開発中は検証レイヤを有効にして、アプリケーションをリリースする際にオーバーヘッドを完全に無効にできます。
検証レイヤは誰でも記述できますが、Khronos は VK_LAYER_KHRONOS_validation
という単一の標準セットを提供しています。アプリで検証レイヤを有効にするには、Android NDK ページで Android の Vulkan 検証レイヤをご確認ください。
RenderDoc
RenderDoc は、検査と分析のためにフレームをキャプチャできるもう 1 つの強力なオープンソース ツールです。これは、グラフィック プログラマーがレンダリングされたシーンをデバッグするために使用している非常に強力なツールです。Android の Vulkan を適切にサポートしていますが、アプリを動作させるにはアプリをデバッグ可能として設定する必要があります。
Android アプリで RenderDoc をセットアップして使用する方法については、Android で RenderDoc を使用するをご覧ください。
ライブラリのキャプチャ / リプレイ
GFX 再構成
GFXRestruct は、アプリによって実行されたグラフィック API 呼び出しをキャプチャして再生するためのツールを提供するオープンソース プロジェクトです。記録されたトレースを後で再生して、キャプチャしたアプリのグラフィック固有の動作を再構築できます。GFXRestruct の主な利点の 1 つは、リリース済みのアプリで使用できることです(android:debuggable をオフにしている場合)。
詳細については、プロジェクトのリポジトリをご覧ください。Android での Vulkan の設定と使用方法については、Android 用 GFXReSTRUCT API キャプチャとリプレイをご覧ください。
トレース ファイルは移植できないことに注意してください。つまり、あるデバイスでファイルをキャプチャして、別のデバイス(OS バージョン、チップセット、ドライバ バージョンが異なる)で再生することはできません。
プロファイラ
Android GPU Inspector(AGI)
Android GPU Inspector(AGI)は Android 用に構築されたグラフィック プロファイラで、System Profile と Frame Profiler が含まれています。ゲームのパフォーマンス プロファイルの把握とボトルネックの特定に役立つ、大まかなプロファイリング情報を提供します。
AGI をダウンロードしてその使用方法については、Android GPU Inspector のウェブサイトをご覧ください。
Android Studio プロファイラ
Android Studio Profiler は、アプリのパフォーマンスをプロファイリングするのに便利なツールです。ただし、特にグラフィックのプロファイリングを目的としたものではありません。CPU Profiler、Memory Profiler、Network Profiler、Energy Profiler、Power Profiler、Event Monitor で構成されています。
Android Studio Profiler のセットアップ方法と使用方法について詳しくは、アプリのパフォーマンスをプロファイリングするのセクションをご覧ください。
OEM プロファイラ
このセクションのツールは OEM 固有であるため、他のチップで実行されているデバイスでは動作しない場合があります。
モバイル版 ARM Performance Studio
Arm Performance Studio for Mobile は、Arm Mobile Studio の新しい名称です。ARM GPU のパフォーマンスの問題を特定して修正するのに役立つ、Graphics Analyzer と Frame Advisor を含むツールスイートです。
詳細については、Arm Performance Studio for Mobile のウェブサイトをご覧ください。
Mali GPU 用 ARM PerfDoc
PerfDoc は、ARM の Mali GPU のベスト プラクティスに照らしてアプリを検証するために開発された Vulkan レイヤです。その後、VK_LAYER_KHRONOS_validation に統合され、基本的には標準の Vulkan 検証レイヤの一部となっています。
使用方法については、検証レイヤによるデバッグのセクションをご覧ください。
Qualcomm Snapdragon Profiler
Qualcomm Snapdragon Profiler は、アプリ デベロッパーが CPU、GPU、DSP、メモリ、電力、温度、ネットワークのパフォーマンスを分析して、チップセットのボトルネックを特定できるように、Qualcomm が開発したプロファイリング ソフトウェアです。
詳しくは、Qualcomm Developer Network の Snapdragon Profiler をご覧ください。
Samsung GPUWatch
Samsung の GPUWatch は、Samsung デバイスの GPU アクティビティをモニタリングするためのツールです。他のツールとは異なり、このツールはモバイル デバイスから直接使用できるため、別のホスト コンピュータにアクセスできない場合でも、アプリケーションのパフォーマンスをすぐに確認できるので非常に便利です。
有効にする方法について詳しくは、ユーザーガイドをご覧ください。
PVRTune
Imagination Technologies の PVRTune を使用すると、デベロッパーはさまざまなカウンタと指標を使用して、PowerVR ハードウェア上のアプリケーションをリアルタイムでプロファイリングできます。また、セッションを保存して、より詳細な低レベルの分析や、パフォーマンスのボトルネックを検出することもできます。
PVRTune の使用方法について詳しくは、マニュアルをご覧ください。
移行ツール
GLSL から SPIR-V へのシェーダーの変換
Vulkan API は、シェーダー プログラムを SPIR-V バイナリ中間形式で提供することを前提とします。この規則は OpenGL ES とは異なります。OpenGL ES では、OpenGL シェーディング言語(GLSL)で記述されたソースコードをテキスト文字列として送信できます。
NDK r12 以降には、GLSL シェーダーを Vulkan で使用できる SPIR-V にコンパイルするためのランタイム ライブラリが含まれています。shaderc コンパイラを使用して、GLSL で記述されたシェーダー プログラムを SPIR-V にコンパイルできます。ゲームで HLSL を使用している場合は、DirectXShaderCompiler が SPIR-V 出力をサポートします。
通常は、ゲームのアセット ビルドプロセスの一環としてシェーダー プログラムをオフラインでコンパイルし、ランタイム アセットの一部として SPIR-V モジュールを含める必要があります。
Vulkan アプリのシェーダー コンパイル プロセスの詳細については、Android NDK セクションの Android の Vulkan シェーダー コンパイラをご覧ください。
高度な機能
Android Frame Pacing を Vulkan レンダラに統合する
Android Frame Pacing ライブラリ(Swappy とも呼ばれます)を使用すると、Vulkan ゲームはスムーズなレンダリングと正しいペーシングを実現して、ゲーム レンダリング ループを OS のディスプレイ サブシステムおよび基盤となるディスプレイ ハードウェアと同期した状態に保つことができます。
正しいペーシングにより、テアリングと呼ばれる視覚的なアーティファクトが排除され、ディスプレイの更新とフレーム表示との同期により消費電力が最適化されます。また、フレームレートを安定させることでジャンクが排除されます。フレーム ペーシングの重要性について詳しくは、AGDK の Frame Pacing ライブラリのセクションをご覧ください。
フレーム ペーシングをゲームに統合する方法について詳しくは、Android Frame Pacing を Vulkan レンダラに統合するをご覧ください。
Vulkan の事前回転でデバイスの向きを処理する
アプリケーション外でのサーフェス回転処理は無料でない場合があります。専用のディスプレイ プロセッシング ユニット(DPU)を備えた一部のハイエンド デバイスでも、支払いが測定可能なパフォーマンスの低下を招く可能性があり、その影響はアプリケーションが CPU バウンドか GPU バウンドかによって異なります。
Vulkan を使用すると、デベロッパーは OpenGL と比較して、レンダリング状態についてより多くの情報をデバイスに指定できます。たとえば、デバイスの向きやレンダリング サーフェスの向きとの関係があります。この機能を使用すると、事前回転を実装して Android で Vulkan を最大限に活用できます。
Vulkan アプリでデバイスの回転を効率的に処理する方法については、Vulkan の事前回転でデバイスの向きを処理すると、付属のデモ アプリケーションをご覧ください。
精度を下げて最適化する
グラフィック データとシェーダー計算の数値形式は、ゲームのパフォーマンスに大きく影響する可能性があります。最新の 3D グラフィックスの計算やデータの大半は、浮動小数点数を使用しています。Android の Vulkan は、32 ビットまたは 16 ビットの浮動小数点数を使用します。32 ビットの浮動小数点数は、一般に単精度または完全精度と呼ばれます。64 ビット浮動小数点型は Vulkan で定義されていますが、通常はサポートされていないため、使用は推奨されません。
演算で最高のパフォーマンスが得られるように Vulkan アプリケーションを最適化する方法については、精度を下げて最適化するをご覧ください。