グラフィックス診断の概要
グラフィックス診断を使用すると、DirectX ベースのゲームやアプリのレンダリングのエラーをデバッグできます。
Visual Studio 2013 の要件
Visual Studio 2013 でグラフィックス診断を使用するには、次のいずれかのエディションが必要です。
Visual Studio 2013 Ultimate
Visual Studio 2013 Premium
Visual Studio 2013 Professional
Visual Studio 2013 Express for Windows
注意
Visual Studio 2013 Express for Windows Desktop は、グラフィックス診断機能をサポートしていません。
オペレーティング システムと SDK の要件
Windows 8.1 用 Windows Software Development Kit (SDK) では、グラフィックス診断に必要なランタイム コンポーネントがインストールされ、Windows 8.1 および Windows 8 の開発がサポートされます。 Windows 7 および Windows Vista でグラフィックス診断を使用するには、次のいずれかの SDK をインストールする必要があります。
Windows SDK (Version 7.1)
DirectX SDK (June 2010)
DirectX のバージョンの互換性
グラフィックス診断は Direct3D 10、Direct3D 10.1、Direct3D 11、Direct3D 11.1、および Direct3D 11.2 を使用するアプリをサポートし、Direct2D を使用するアプリへのサポートは制限されています。 旧バージョンの Direct3D、DirectDraw、または他のグラフィックス API を使用するアプリケーションはサポートしません。
Windows 8.1 および Direct3D 11.2
Windows 8.1 では、DirectX 11.2 は新機能を導入しており、ランタイムを通じてグラフィックス情報をキャプチャするためのサポートが含まれています。 Windows 8.1 は、Windows 8.1 がサポートする DirectX のすべてのバージョンに対して、新しいランタイムベースのキャプチャ (ロバスト キャプチャ) を使用します。 ロバスト キャプチャは、Direct3D 11.2 の新機能もサポートしています。
Windows 8 および Windows 7 のサポート
Windows の以前のバージョンは DirectX 11.2 をサポートしていないため、これらのプラットフォームではロバスト キャプチャは有効ではありません。 代わりに、Windows 8 または Windows 7 で稼動するアプリケーションは、以前の迂回ベースのキャプチャ方法 (レガシー キャプチャ) を使用します。 Windows 8.1 ではレガシー キャプチャをサポートする必要がないため、レガシー キャプチャは推奨されません。ただし、Windows 8 または Windows 7 で稼動しているアプリケーションをサポートするために、まだ使用することができます。
Direct2D の制限されたサポート
Direct2D は、Direct3D 上にビルドされるユーザー モード API であるため、グラフィックス診断を使用すると、Direct2D を使用するアプリのレンダリングに関する問題のデバッグに役立ちます。 ただし、上位レベルの Direct2D イベントの代わりに、基になる Direct3D イベントのみが記録されるため、Direct2D イベントはグラフィックス イベント一覧に表示されません。 また、Direct2D イベントと結果の Direct3D イベントの間の関連性が必ずしも明らかではないため、Direct2D を使用するアプリのレンダリングに関する問題をデバッグするためにグラフィックス診断を使用することは複雑です。 それでも、グラフィックス診断を使用して Direct2D を使用するアプリケーションで発生する低水準のレンダリングに関する問題の情報は取得できます。
Visual Studio 2013 Update 3 におけるユーザー インターフェイスの変更点
Visual Studio 2013 Update 3 以降では、メインの Visual Studio IDE 内の限られたスペースに表示するツール ウィンドウの数を減らすために、グラフィックス診断ツールのウィンドウが、Visual Studio シェルの独立したコピー内でホストされます。 グラフィックス診断ツールをホストする、Visual Studio のグラフィックス分析と呼ばれるこのカスタマイズされたシェルでは、グラフィックス診断に必要のないメニューとオプションは表示されなくなりますが、その点を除けば、以前の Visual Studio のバージョンにおけるグラフィックス診断と同じグラフィックス診断ツールとワークフローが提供されます。
2 つの重要な違いを次に示します。
グラフィックス診断の下でアプリを実行したときに、Visual Studio では、グラフィックス ログ ドキュメントの最新バージョンが表示されなくなります。 代わりに、Visual Studio は新しいキャプチャ インターフェイスを提供します。 新しいキャプチャ インターフェイスの外観は次のようなものです。
このインターフェイスでは、1 つまたは複数のフレームをグラフィックス ログにキャプチャし、アプリのフレーム レートや、各フレームのレンダリングにかかった時間 (ミリ秒) が表示されたリアルタイム グラフを確認できます。
グラフィックス分析シェルではコードを編集できません。グラフィックス分析での編集用にコードを開いた場合、そのコードはメインの Visual Studio IDE 内で開かれ、フォーカスが与えられます。
このインターフェイスは、Visual Studio に表示されるものです。 Visual Studio のグラフィックス分析を起動するには、画像サムネイルの上の [フレーム …] リンクに従って、またはサムネイルをダブルクリックして、いずれかのフレームを選択します。
グラフィックス診断を使用したレンダリング問題のデバッグ
グラフィックを多用したアプリのレンダリングに関する問題のデバッグは、デバッガーを起動してコードをステップ実行するような簡単な作業ではありません。 各フレームでは、状態、データ、パラメーター、およびコードの複雑なセットに応じて、何百何千もの一意のピクセルが生成され、そのような診断対象のうち、問題が発生しているのはほんの少数である場合があります。 さらに複雑なことに、各ピクセルを生成するコードは、何百ものピクセルを並列に処理する特別なハードウェアで実行されます。 スレッドが少ないコードに対してさえ活用が困難な従来のデバッグ ツールおよび方法は、大量のデータに対応するときに役に立ちません。
Visual Studio のグラフィックス診断ツールは、レンダリングに関する問題の特定に役立つように設計されています。まず、問題を示している表示の不具合から開始して、次に、アプリのソース コード内で、関連するシェーダー コード、パイプライン ステージ、描画呼び出し、リソース、およびデバイスの状態だけに注目することにより問題の原因までさかのぼってトレースします。
Visual Studio によって解決できるレンダリングに関する問題の一部を次に示します。
デバイスの状態
グラフィック デバイスの構成により、グラフィックス パイプラインで各描画呼び出しに関連付けられたデータが解釈される方法が決定されたり、描画呼び出し出力がマージされる方法が決定されるため、グラフィック デバイスの正しい構成は重要です。 たとえば、デバイスの状態で時計回りの頂点を結ぶ順序が指定されている場合は、反時計回りの順序で頂点を指定するモデルは正しくレンダリングされません。 デバイスの状態に関する問題は、ソース コード上で問題の原因が影響を受けるオブジェクトから離れていることが多いため、診断が困難です。 グラフィックス診断を使用すると、レンダリング中に現在のデバイスの状態をいつでも表示できます。初期化されていないまたは正しくない定数バッファーとパラメーター
グラフィックス アプリは定数バッファーとパラメーターを使用して、描画呼び出しまたは描画呼び出しのセットに追加データを渡します。 たとえば、データによって、異なるオブジェクトに対して異なる場所または外観が指定されている場合があります。 そのデータが初期化されていない場合、またはそのデータに正しくない値が含まれる場合は、対応するオブジェクトが誤ってレンダリングされるか、まったくレンダリングされません。 この種の問題については、問題がデータ内にあるのか、データを消費するシェーダー コード内にあるのかが必ずしも明らかではないため、診断が困難な場合があります。 また、エラーに対応するシェーダー、定数バッファー、およびパラメーターを特定することが困難な場合があります。 グラフィックス診断を使用すると、各描画呼び出しに適用されるシェーダー、定数バッファー、およびパラメーターを特定し、それらの内容を表示できます。シェーダーのバグ
アプリケーション コードの記述において、コードが C++ であっても HLSL (上位レベル シェーダー言語) であっても、間違いを避けることはほぼ不可能です。 ただし、C++ などの言語に用意されている豊富なデバッグ サポートが存在しないため、従来より HLSL コードのデバッグはより困難です。 グラフィックス診断では、従来のコード デバッグ ツールが HLSL で使用できるので、コードをステップ実行して、ブレークポイントを設定し、変数、パラメーター、および定数バッファーの内容を調べることができます。
グラフィックス診断のしくみ
グラフィックス診断を使用するには、まず、実行中のアプリが Direct3D API を使用する方法に関する情報を記録し、次に、記録された動作を後で調べます。 指定したフレームについて記録される情報には、画面のクリア、ジオメトリの描画、計算シェーダーのディスパッチ、またはグラフィックス デバイスの状態の変更などを行う API 呼び出しとその引数、および間接的に参照されるバッファーとオブジェクトのコピーが含まれます。 また、フレームがレンダリングされる前に、セットアップと初期化に関連する API 呼び出しが記録されます。 記録される情報は、グラフィックス ログ (.vsglog) ファイルに書き込まれます。
開発用コンピューター、リモート コンピューター、またはリモート デバイスでグラフィックス イベントを再生することにより、グラフィックス ログに記録されたレンダリング動作を再作成できます。 再生コンピューターは、グラフィックス ログが最初にキャプチャされたコンピューターまたはデバイスと同じか、別のコンピューターまたはデバイスにすることができます。 ほとんどの再生機能に関して、再生コンピューターのグラフィックス ハードウェアを使用してグラフィックス イベントが再生されますが、HLSL デバッガーが使用される場合は、CPU でエミュレートされた GPU を使用することによりシェーダー コードが常に再生されます。 エミュレートされた GPU を使用すると、再生コンピューターのグラフィックス ハードウェアがハードウェア デバッグをサポートするかどうかに関係なく、シェーダー コードのステップ実行や変数の調査を行ったり、その他の一般的なデバッグ機能を使用したりできます。
注意
グラフィックス ログには関連情報の大部分が内部的にキャプチャされますが、グラフィック診断の一部の機能を十分に活用するには追加の情報が必要です。たとえば、グラフィックの呼び出し履歴の機能を十分に活用するには、プログラム データベース (.pdb) ファイルとアプリケーションのソース コードが必要です。HLSL シェーダーのソース コードをデバッグするには、シェーダーのソース コードも必要です (シェーダーが D3D11.1 シェーダー コンパイラを使用してコンパイルされていて、デバッグ情報を使用できる場合は、キャプチャ中にシェーダーのソース コードがグラフィックス ログに埋め込まれます)。
注意
Windows または DirectX の以前のバージョンでは特定の API を使用できない可能性があるため、これらの API 呼び出しをキャプチャしたグラフィックス ログは、サポートしていない再生コンピューター上では再生できません。
グラフィックス ログ
グラフィックス ログには、実行中の DirectX のグラフィックス アプリケーションからキャプチャされた 1 つ以上のフレームが含まれます。 グラフィックス ログは単体で使用できるため、これらのフレームは外部情報または参照なしに後で再作成できます。 つまり、グラフィックス ログを他の開発者と共有したり、別のコンピューターで問題を調べたりできます。また、モデルとテクスチャが開発で変更されていても、変更前のグラフィックス ログを調べることができます。 データとレンダリングの結果を比較するために、複数のグラフィックス ログ (.vsglog) ファイルを同時に読み込むこともできます。
グラフィックス ログ (vsglog) ファイルを開くには
Visual Studio のメニュー バーで、[ファイル]、[開く]、[ファイル] の順に選択します。 [ファイルを開く] ダイアログ ボックスが表示されます。
開くグラフィックス ログ (.vsglog) ファイルを指定し、[開く] ボタンをクリックします。
注意
Visual Studio の一部であるグラフィック ツールを使用して、グラフィックス ログからメッシュおよびテクスチャのコピーを展開、変更および保存できます。ただし、グラフィックス ログの内容はこの変更の影響を受けません。これらのグラフィックス ツールの使用に関する詳細については、「ゲームとアプリケーション用の 3D アセットの操作」を参照してください。
[グラフィックス] ツール バー
[グラフィックス] ツール バーを使用すると、グラフィックス診断コマンドやツール ウィンドウにすばやくアクセスできます。
[診断の開始] を使用して、グラフィックス診断の下でアプリを実行します。 グラフィックス診断の下でアプリが実行されているときは、[次の描画フレームをキャプチャします] が有効です。また、他のボタンを使用して別のツール ウィンドウを表示できます。 グラフィックス診断の下でアプリを実行し、グラフィックス情報をキャプチャする方法の詳細については、「グラフィックス情報のキャプチャ」を参照してください。
グラフィックス診断ツール ウィンドウ
次の図は、キャプチャされたフレームを調べてデバッグするために使用されるツール ウィンドウの一般的なレイアウトを示しています。 各ウィンドウには、調査されるフレームの個々のピクセルに至るまで、キャプチャされたフレームについて異なるカテゴリの情報が公開されます。
関心のあるレンダリングの問題を特定するには、グラフィックス ログ ドキュメント ウィンドウを使用します。
レンダリングの問題に関連するイベントを特定するには、[グラフィックス イベント一覧] を使用します。
レンダリングの問題が最初に表示されるパイプライン ステージを特定するには、[グラフィックス パイプライン ステージ] ウィンドウを使用します。
レンダリングの問題に関連するアプリ コードを特定するには、[グラフィックス イベント呼び出し履歴] を使用します。
ピクセルの最終的な色に影響を及ぼすイベントの詳細を調べるには、[グラフィックス ピクセル履歴] を使用します。
レンダリングの問題に関連するオブジェクトの詳細を表示するには、[グラフィックス オブジェクト テーブル] を使用します。
DirectX コントロール パネル
DirectX コントロール パネルは、DirectX の動作を変更するために使用できる、DirectX のコンポーネントです。たとえば、DirectX のランタイム コンポーネントのデバッグ バージョンを有効にする、報告されるデバッグ メッセージの種類を選択する、および処理能力の低いハードウェアをエミュレートするために一部のグラフィックス ハードウェア機能が使用されないようにすることができます。 DirectX に対するこのレベルの制御は、DirectX アプリケーションのデバッグとテストに役立ちます。 Visual Studio から DirectX コントロール パネルにアクセスできます。
DirectX コントロール パネルを開くには
- メニュー バーで、[デバッグ]、[グラフィックス]、[DirectX コントロール パネル] を選択します。