パフォーマンス最適化ツール
LINK PC-VR DOCUMENTATION
このトピックでは、PC SDKを利用した開発について説明します。Meta Questアプリのパフォーマンスの最適化については、使用する開発プラットフォームに応じて、次のトピックのいずれかをご覧ください。 このセクションでは、パフォーマンス上の問題を見つけるために使うツールについて説明します。
問題をトリアージして解決するためのワークフローについて、ガイダンスまたは決定木を提供するため、このガイドではさまざまなパフォーマンス最適化ツールを取り上げます。グラフィックに関する問題を解決したい場合、大抵は、アプリがクラッシュしているか、ブラックスクリーンが表示されているか、レイテンシが高いためにパフォーマンスが遅延しているかもしれません。とはいえ、同じタイプの問題を引き起こす条件はたくさんあるため、見えている症状の根本原因を見つける必要があります。このセクションで紹介するツールにより、より早く問題を絞り込み、根本原因まで掘り下げて調査することが可能になります。
以下の最適化ツールは、パフォーマンス問題を切り分けて解決するのに役立ちます。
ロストフレームキャプチャ
このツールは、アプリの実行中にドロップしたフレームのアイディスプレイをキャプチャし、そのフレームだけをパフォーマンス統計とグラフを確認しながらリプレイすることができます。これにより、アプリがどこでフレームレートを維持できなかったかを簡単に知ることができます。多くの場合、問題の判別にはこれで十分です。ロストフレームキャプチャは、オフラインで使用する分析ツールです。ツールをキャプチャモードにし、VRアプリを実行し、キャプチャモードを停止させると、ドロップしたフレームのコンテンツをオフラインで確認できます。さらに、キャプチャしたコンテンツをOculusデバッグアーカイブ(ODA)ファイルに保存することで、データをエクスポートすることもできます。これにより、ロストフレームデータを簡単に共有でき、フレームがドロップする状況を再現して、根本的な問題を突き止めることができます。詳しくは、
ロストフレームキャプチャをご覧ください。
VRゲーム(FCAT VR)のNVIDIAフレームキャプチャ分析ツール
FCAT VRはNVIDIAが提供しているツールですが、どのGPUハードウェアでも使用可能です。FCAT VRキャプチャツールのコンポーネントの1つはPCで実行されます。Windows用イベントトレーシング(ETW)で生成される、イベントトレーシングデータを使います。(ETWイベントトレーシングデータのキャプチャプロセスについて詳しくは、このガイド内の
チュートリアル: サンプルアプリの最適化をご覧ください。)FCAT VRの2つ目のコンポーネントは、ETWがキャプチャしたイベントトレーシングデータをインポートし、フレームタイミング、ドロップフレーム、ワープフレーム、合成フレーム(非同期スペースワープ)、リプロジェクションやその他の問題を分析するのに役立つチャートを表示します。詳しくは、
VRゲームのフレームキャプチャ分析ツールをご覧ください。
Oculusデバッグツール
このツールは、OculusパフォーマンスHUDと呼ばれる、ライブのヘッドアップディスプレイを提供します。この情報ディスプレイは、パフォーマンス問題とVRエクスペリエンスの特定の状況を関連付け、リアルタイムでその状況を検証するのに役立ちます。ドロップしているコンポジターフレームの数や、アプリやコンポジターでフレームのレンダリングにかかっている時間などの統計を確認できます。
OculusパフォーマンスHUDにより、考えられる問題を素早く絞り込むことができ、アプリの全体的なパフォーマンスに影響していないコンポーネントのパフォーマンス改善に労力をかけずに済みます。例えば、アプリのフレームがドロップし、CPUプロファイルで、フレームサイクルの特定の時点で使用率が急激に上昇している場合は、(CPUがGPUを待機しているのでない限り) GPUの問題を考慮する必要はありません。
このように特定できれば、ETWトレースを取得し、そのトレースをWindowsパフォーマンスアナライザー(WPA)やGPUViewを使って分析することで、より低下層の重要な分析が可能になります。例えば、アプリがCPUバウンドで、物理処理とドローコール提出のあたりで失速しているとします。たとえアプリがCPUバウンドであっても、ドローコール生成でスタックがあることがあり、その場合はバッチングを増やすことができます。GPUViewなどのツールは、このような問題を正確に絞り込み、コードのどこを変更したら良いかを知るのに役立ちます。詳しくは、
Oculusデバッグツールと
パフォーマンスヘッドアップディスプレイをご覧ください。
SDK統計
SDKを直接呼び出して、OculusパフォーマンスHUDに表示されるものと同じ統計を入手し、それをコードで利用することもできます。例えば、コンソールアウトプットに特定の統計を書き込んだり、特定の状況が生じる場合にデバッガーを呼び出したりすることができます。詳しくは、
SDKパフォーマンス統計をご覧ください。
パフォーマンスプロファイラー
この分析ツールは、直接SDKから、またOculusパフォーマンスHUD内で取得できるものと同じタイプの統計データを基に、グラフを作成します。一定の期間に起きるパターンを分析する必要がある場合は、これらのグラフを活用できます。詳しくは、
パフォーマンスプロファイラーをご覧ください。
Windowsイベントトレーシング(ETW)
ETWトレースの分析には、一般的にWindowsパフォーマンスアナライザー(WPA)、GPUView、またはその両方が使われます。
Windowsパフォーマンスアナライザー(WPA)
WPAは、システム負荷の理解に役立つコンテキスト情報を含む、トレースアウトプットをトップダウンビューで提供します。
WPAがトレースをロードすると、トレースはイベントが発生した順序通りに序列化されて表示されます。例えば、アプリが90%の時間をカメラのレンダリングに使っていることが分かったとします。そして、その時間の90%が茂みの描写に使われていました。その中で、80%の時間が木の葉のレンダリングに、さらに30%の時間がアルファブレンディングに使われています。この場合、アルファブレンディングの計算コストを抑えるために、シェーディングを変更することができるかもしれません。このアプローチにより、アプリ全体のパフォーマンスが向上します。
GPUView
GPUViewは、トレースアウトプットの低下層のビューを提供します。WPAが提供するコンテキスト情報は含まれていません。ただし、GPUViewでは、WPAでは提供されない、CPUとGPU間のインタラクションについての情報を提供します。GPUViewではコンテキスト情報がないため、アプリのライフサイクル内の特定のポイントを見つけるのが難しい場合があります。それで、2つのツールは補完的に使用することができます。例えば、WPAを使ってクローズアップし、目的のVRフレームインデックスを見つけ出し、その情報を基に、GPUView内で同じフレームを特定することができます。
UnityまたはUnrealを使用している場合は、そのビルトインプロファイラーを利用して、大抵のボトルネックをデバッグできます。例えば、シェーダーが複雑すぎる場合や、スクリプトの実行時間が長すぎる場合、これらのプロファイラーを使って問題を見つけることができます。ただし、アプリで競合と同期の問題が多い場合や、アプリの使用率でははっきり分からない異常がある場合には、GPUViewでシステムのキューをより細かく見ることができます。このようにして、効率の悪いポリシーや不適切な同期メカニズムを特定できます。例えば、頂点バッファが大きすぎる場合、ページフォールトが生じることがあります。GPUがシステムメモリからフェッチしている可能性があり、メッシュが複雑すぎることが分かるかもしれません。
GPUViewは次のような問題を解決するのに役立ちます。
- アプリにVSyncインターバルがないのはなぜですか?
- 新しいサーフェスの割り当てが原因で、GPUが失速し、フレームが途切れてしまうのでしょうか?
- CPUコードを最適化すればパフォーマンスが向上しますか、それともGPUの負荷を軽くするべきですか?
- GPUにグラフィックタスクを送信するフレームのタイミングが遅すぎますか、それともCPUコードの待機中にGPUはアイドル状態になっていますか?
ovrlog_win10
このスクリプトは、Windows 10でETWトレーシングセッションを開始および停止させるために使用します。(Windowsの旧バージョンにはovrlogを使います。)ETWトレースアウトプットは、WPAとGPUViewへのインプットとして使われます。ovrlog_win10とovrlogのスクリプトで、xperfツールが呼び出されます。このツールは、イベントキャプチャプロセスを開始し、ファイルパスを設定し、Oculusアプリに関連するすべてのイベントを投入し、完了時にイベントトレーシングをオフにします。
ovrlog_win10とovrlogは、カーネルレベルとアプリレベルのイベントをキャプチャするよう設計されています。次のものが含まれます。
- アプリの開始時間
- 割り込みアクティビティ
- システム応答性の問題
- アプリリソースの利用
- 割り込み
- その他
ovrlog_win10とovrlogは、次の場所にあります。
%PROGRAMFILES%\Oculus\Support\oculus-diagnostics\ETW> ovrlog_win10.cmd
ovrlogとovrlog_win10は、どちらもランタイムに付属しています。
VSync (垂直同期)は、ディスプレイが現在のリフレッシュサイクルを終了するまでディスプレイメモリの変更を防ぐタイムポイントです。多くの場合、VSyncはVRアプリを最適化する際の最も重要なナビゲーションユニットです。
一般的なovrlogワークフローは次のとおりです。
- Oculusアプリの実行中にETWトレースを生成します。
- WPAにトレースファイルを読み込み、問題が起きているフレームインデックスを見つけます。
- GPUViewにトレースファイルを読み込み、該当するフレームインデックスのVSyncを特定します。
- そのフレームインデックスの周辺にクローズアップします。おそらく、前後10フレーム程度のインターバルが表示されています。
- 問題のフレームと近くにある問題のないフレームを比較します。特に、フレームがCPUとGPUのリソースをどのようにスケジューリングしているかを調べます。
- CPU/GPUの処理と、それらがアプリ内で実行している機能を照合します(パケットをクリックすると、対応する実行中のアプリレベルの処理をハイライト表示できます)。
- ここから、頂点バッファが大きすぎるなど、パフォーマンス上の問題を引き起こしている原因を推測します。