Visual Studio グラフィックス診断の概要

Visual Studio の "グラフィックス診断" は、Direct3D アプリのレンダリングとパフォーマンスを記録し、問題を分析するためのツール セットです。 グラフィックス診断は、Windows PC 上のローカルで、またはリモートの PC やデバイス上で実行されているアプリに対して使用できます。

グラフィックス診断を使用したレンダリング問題のデバッグ

グラフィックスを多用したアプリのレンダリングに関する問題のデバッグは、デバッガーを起動してコードをステップ実行するような簡単な作業ではありません。 各フレームでは、状態、データ、パラメーター、およびコードの複雑なセットに応じて、何百何千もの一意のピクセルが生成され、そのような診断対象のうち、問題が発生しているのはほんの少数である場合があります。 さらに複雑なことに、各ピクセルを生成するコードは、何百ものピクセルを並列に処理する特別なハードウェアで実行されます。 スレッドが少ないコードに対してさえ活用が困難な従来のデバッグ ツールおよび方法は、大量のデータに対応するときに役に立ちません。

Visual Studio のグラフィックス診断ツールは、レンダリングに関する問題の特定に役立つように設計されています。まず、問題を示している表示の不具合から開始して、次に、アプリのソース コード内で、関連するシェーダー コード、パイプライン ステージ、描画呼び出し、リソース、およびデバイスの状態だけに注目することにより問題の原因までさかのぼってトレースします。

DirectX のバージョンの互換性

グラフィックス診断は、Direct3D 10 以降を使用するアプリをサポートし、Direct2D を使用するアプリに限定的なサポートを提供しています。 旧バージョンの Direct3D、DirectDraw、または他のグラフィックス API を使用するアプリケーションはサポートしません。

Windows 10 と Direct3D 12

注意

Visual Studio は、DirectX 12 ゲーム用に Windows の PIX を推奨しています。 Windows の PIX は、DirectX 12 を完全にサポートするパフォーマンス チューニングおよびデバッグ ツールです。 詳細を参照するか、こちらでダウンロードしてください。

Windows 10 では Direct3D 12 が導入されました。Direct3D 10 と Direct3D 11 は大きく異なります。 これらの違いは、DirectX を最新のグラフィックス ハードウェアに合わせて調整し、その潜在能力を十分に引き出すために生じたものですが、それによって API にも大幅な変更が必要となり、リソースの有効期間と競合を管理する仕事がこれまで以上にプログラマの責任になりました。 違いはあるものの、Direct3D 12 を使用したグラフィックス診断は、Direct3D 11.2 を使用したグラフィックス診断との機能パリティを維持しています。

Windows 10 では、前のバージョンの Direct3D と、それらに依存するゲームやアプリケーションも引き続きサポートされます。 Visual Studio のグラフィックス診断は、Windows 10 上の Direct3D 10 と Direct3D 11 を引き続きサポートします。

Direct2D の制限されたサポート

Direct2D は、Direct3D 上にビルドされるユーザー モード API であるため、グラフィックス診断を使用すると、Direct2D を使用するアプリのレンダリングに関する問題のデバッグに役立ちます。 ただし、上位レベルの Direct2D イベントの代わりに、基になる Direct3D イベントのみが記録されるため、Direct2D イベントはグラフィックス イベント一覧に表示されません。 また、Direct2D イベントと結果の Direct3D イベントの間の関連性が必ずしも明らかではないため、Direct2D を使用するアプリのレンダリングに関する問題をデバッグするためにグラフィックス診断を使用することは複雑です。 それでも、グラフィックス診断を使用して Direct2D を使用するアプリケーションで発生する低水準のレンダリングに関する問題の情報は取得できます。

Visual Studio のグラフィックス診断機能

グラフィックス診断にはレンダリングの問題を診断するための専用のインターフェイス (Graphics Analyzer ウィンドウ) がありますが、Visual Studio のインターフェイスにもいくつかのツールが追加されます。

[グラフィックス] ツール バー (Visual Studio)

[グラフィックス] ツール バーを使用すると、グラフィックス診断コマンドにすばやくアクセスできます。

[診断の開始] を使用して、グラフィックス診断の下でアプリを実行します。 グラフィックス診断の下でアプリを実行すると、 [次の描画フレームをキャプチャします] ボタンが有効になります。

診断キャプチャのインターフェイス

グラフィックス診断の下でアプリを実行すると、Visual Studio には診断セッションのインターフェイスが表示され、フレームをキャプチャする際に使用したり、現在の CPU および GPU の負荷を表示したりできます。 CPU と GPU の負荷を表示すると、キャプチャしようとしているフレームがレンダリングのエラーではなくパフォーマンス特性のために問題を起こしているかどうかを識別できます。

フレームをキャプチャする方法はほかにもあります。 プログラムによるキャプチャ インターフェイスや、キャプチャを行うコマンド ライン プログラム dxcap.exe を使用して、フレームをキャプチャすることもできます。

詳細については、「グラフィックス情報のキャプチャ」を参照してください。

GPU 使用率

グラフィックス診断では、Direct3D アプリのパフォーマンスのプロファイリングを行うこともできます。 グラフィックス イベントを詳細に記録している間は正確なプロファイリング データを取得できないことがあるため、この診断は Graphics Analyzer による調査で使用するフレームのキャプチャとは別個に行います。

詳細については、「GPU 使用率」を参照してください。

DirectX コントロール パネル

DirectX コントロール パネルは、DirectX の動作を変更するために使用できる、DirectX のコンポーネントです。たとえば、DirectX のランタイム コンポーネントのデバッグ バージョンを有効にする、報告されるデバッグ メッセージの種類を選択する、および処理能力の低いハードウェアをエミュレートするために一部のグラフィックス ハードウェア機能が使用されないようにすることができます。 DirectX に対するこのレベルの制御は、DirectX アプリケーションのデバッグとテストに役立ちます。 Visual Studio から DirectX コントロール パネルにアクセスできます。

DirectX コントロール パネルを開くには

  • メニュー バーで、 [デバッグ][グラフィックス][DirectX コントロール パネル] を選択します。

Graphics Analyzer

Visual Studio Graphics Analyzer は、あらかじめキャプチャしたフレームからレンダリングとパフォーマンスの問題を調べるための専用のインターフェイスです。 Graphics Analyzer には、アプリのレンダリング動作を探索して理解するために役立ついくつかのツールがあります。 各ツールは、調査対象のフレームについて異なる種類の情報を明らかにします。それらのツールは、連携して使用し、フレームバッファーの外観から始めて、レンダリングの問題の原因を直感的に絞り込んでいくように設計されています。

Graphics Analyzer のツールの一般的なレイアウトを次の図に示します。

すべてのグラフィックス デバッガー ウィンドウ

[グラフィックス] ツール バー (Graphics Analyzer)

[グラフィックス] ツール バーを使用すると、Graphics Analyzer のツール ウィンドウにすばやくアクセスできます。

グラフィックス診断モードの [グラフィックス] ツール バー

グラフィックス ログ ドキュメント

Graphics Analyzer の中で、グラフィックス ログ ドキュメントはいちばん目立つツール ウィンドウです。 このウィンドウは、グラフィックス診断の下でアプリを実行してキャプチャしたすべてのフレームを表します。 このウィンドウでは、調査する別のフレームを選択したり、調査する特定のピクセルをピクセル履歴ツールを使用して選択したりできます。 このドキュメントに表示されるフレームバッファー イメージは、現在選択されているイベントを反映して変更されるので、時間の経過と共にそのイベントがフレームバッファーに与える影響を確認できます。

グラフィックス ログ ドキュメントは、フレーム分析ツールへのエントリ ポイントにもなります。このツールでは、フレームのパフォーマンスを把握するため、レンダリングの特定の面について構成を変更し、元の構成と比較するベンチマーク結果が提供されます。

イベント一覧

グラフィックのイベントは、各 Direct3D API 呼び出しとユーザー定義のイベントをマークします。

イベント一覧には、調査しているフレームの間に記録されたすべてのグラフィックス イベントが示されます。 重要な要素を見つけやすくするため、イベント一覧は階層的に表示することができます。たとえば、後続の描画呼び出しの下に最新の状態変化を表示したり、タイムラインとして表示したりできます。 さらに、イベントはどのキューに属しているかに基づいて色分け表示され、調査したいイベントだけを表示するように一覧をフィルター処理することもできます。

一覧から 1 つのイベントを選択すると、グラフィックス分析ツールの残りの部分は、そのイベントの時点でのフレームの状態を反映して表示されます。 このようにして、GPU 上での任意のイベントの影響を確認できます。 たとえば、後続の描画呼び出しによって覆い隠されてしまう場合でも、フレームバッファー上での任意の描画呼び出しの直接的な効果を見ることができます。 また、一部のイベントにはハイパーリンクが付けられ、そのパラメーターの詳細や関連するリソース オブジェクトを参照することができます。

パイプライン ステージ

アプリ内の各描画呼び出しは、Direct3D によって提供されるグラフィックス パイプラインを通ります。 パイプライン内の各ステージでは、前のステージからの出力がシェーダーと呼ばれる小さなプログラムによって変換されて次のステージに渡され、画面が最終的にレンダリングされるまでこれが続きます。 多くのレンダリング エラーは、パイプラインのステージ間の境界で出力形式が次のステージが想定しているものと違っていたり、いずれか 1 つのステージで単に間違った結果が生成されたりした場合に発生します。 通常は、画面に表示される最終的な結果だけを見ているため、パイプラインの中のどこでエラーが発生しているかを簡単に識別することはできません。

[パイプライン ステージ] ウィンドウでは、各ステージの結果が独立して視覚化されるため、レンダリングの問題が最初にどのステージで現れたかを比較的簡単に確認できます。 それがどのステージであるかを判別した後は、[バイブライン ステージ] ウィンドウのその場所からシェーダーのデバッグを開始できます。

グラフィックスの状態

レンダリング操作は、通常、複数のオブジェクトに分散した多数の状態に依存して決まります。 多くの種類のレンダリングの問題は、状態が正しく構成されないことが原因で発生します。

[状態] ウィンドウでは、各描画呼び出しに関連する状態情報を 1 か所でまとめて収集できるため、直前の描画呼び出し以後に発生した状態変化を簡単に見つけ、強調表示できます。

ピクセル履歴

複雑なシーンでは、1 つのフレーム内で 1 つのピクセルが複数回にわたってシェーダーで処理されることも珍しくありません。 以前の色を上書きするだけの場合もあれば、色が結合されて透明などの効果を実現する場合もあります。 そのすべてを組み合わせた結果が正しい外観にならない場合、いずれか 1 つの色が間違っているのか、色を結合する方法が間違っているのかを識別するのは困難です。 場合によっては、ピクセルに対する色の適用が何らかの理由で拒否されたため、オブジェクトが欠落しているように見えることがあります。

[ピクセル履歴] ウィンドウでは、フレーム内のすべてのピクセルに関するシェーダーの完全な履歴が、適用を拒否された場合も含めて視覚化されます。 適用を拒否された色については、未加工のシェーダーの結果と、以前の色に新しい各色が結合される様子が表示されます。 この情報を見ると、シェーダーの結果を混ぜ合わせたピクセルの間違いの原因を比較的簡単に見つけたり、レンダリングされたオブジェクトが欠落している原因がピクセルへの色の適用を不適切に拒否されたことにあると判別したりできます。

イベント呼び出し履歴

Direct3D アプリのレンダリングに関する問題は、シェーダー コードが唯一の原因ではありません。時には、アプリのソース コードが間違ったパラメーターを渡したり、Direct3D を適切に構成していなかったりする場合があります。 前に説明したピクセル履歴の機能を使用して判別できる 1 つの種類のエラーは、レンダリングしたオブジェクトのすべてのピクセルが拒否されたために、そのオブジェクトが欠落しているというケースです。 この種のエラーは、通常、設定を適切に構成していない場合に発生します。たとえば、深度テストの実行を制御する構成が適切でない場合は、欠落しているオブジェクトの描画呼び出しの呼び出し履歴内に間違いが見つかることがよくあります。

[イベント呼び出し履歴] ウィンドウには、イベントの一覧に含まれるすべてのグラフィックス イベントの完全な呼び出し履歴が表示され、デバッグ情報が使用可能な場合は、アプリのソース コードにジャンプすることさえできます。 これは、エラーが最初に発見された GPU 上の場所から跡をたどり、アプリのソース コードに戻って問題の発生場所を突き止めることのできる強力なツールです。

オブジェクト テーブル

アプリでレンダリングするすべてのフレームの背後には、おそらく数百、あるいは数千ものリソース オブジェクトが存在します。 たとえば、バック バッファー、レンダー ターゲット、テクスチャ、頂点バッファー、インデックス バッファー、汎用バッファーなど、Direct3D が記憶しているほとんどすべてのものがオブジェクトです。

[オブジェクト テーブル] には、イベントの一覧で選択したグラフィックス イベントの時点で存在するすべてのオブジェクトが表示されます。 標準的なアプリのほとんどのオブジェクトはテクスチャであるため、イベントの一覧は、画像に関連する詳細が一目で分かるように最適化されています。 [種類] の列には、各行が表しているオブジェクトの種類が示され、[形式] の列には、下位の種類やオブジェクトのバージョンが示されます。 その他の詳細も表示されます。 一部のオブジェクトには、より専門的なビューアーでオブジェクトを表示するためのハイパーリンクが表示されます。たとえば、テクスチャであれば、テクスチャを画像として表示することができます。また、バッファーであれば、バッファーのフォーマットを定義することにより、バッファー ビューアーが未加工のバッファー バイトを解析して表示する方法を選択できます。

フレーム分析

アプリのグラフィックスは、単に正しいだけではなく、高速である必要があります。 統合型グラフィックスを搭載したノート PC や、携帯電話など、性能が限られたデバイスでも、高速に表示される必要があります。 しかも、美しく表示される必要があります。

フレーム分析ツールは、アプリが Direct3D を使用する方法を自動的に変更して、さらに最適なパフォーマンスを実現できないかどうかを探索し、比較のためにベンチマークの結果を提供します。 たとえば、フレーム分析では、すべてのテクスチャに対して MIP マッピングを有効にして、そのテクスチャが MIP マッピングからメリットを得られるかどうかを明らかにできますが、現在その機能は有効にされていません。 また、ハードウェアがサポートしている場合、フレーム分析では、GPU のパフォーマンス カウンターから収集した情報を提示できます。このレベルの情報があれば、多数のテクスチャのフェッチ停止やキャッシュ ミスなど、ハードウェア レベルのパフォーマンスの問題を識別できます。

しかし、フレーム分析は高速化だけを目的とはしていません。画質をほとんど落とさずに最大限のパフォーマンスを達成することが目的です。 時には、大きなディスプレイで優れた効果を発揮する高負荷の処理が、携帯電話のような小さな画面で見るとそれほど効果を発揮しないことがあります。その場合、バッテリを消費しないように低負荷の処理にしたほうが適切であると考えられます。 グラフィックス分析による自動的な変更とベンチマーク結果を活用すれば、さまざまなデバイスでアプリに応じた適切なバランスを見つけるめために役立ちます。

関連項目