Direct3D9 と WPF の相互運用性に関するパフォーマンスに関する考慮事項
D3DImage クラスを使用して Direct3D9 コンテンツをホストできます。 Direct3D9 コンテンツをホストすると、アプリケーションのパフォーマンスに影響する可能性があります。 このトピックでは、Windows Presentation Foundation (WPF) アプリケーションで Direct3D9 コンテンツをホストするときのパフォーマンスを最適化するためのベスト プラクティスについて説明します。 これらのベスト プラクティスには、Windows Vista、Windows XP、マルチモニター ディスプレイを使用する場合の D3DImage の使用方法とベスト プラクティスが含まれます。
手記
これらのベスト プラクティスを示すコード例については、WPF と Direct3D9 相互運用
D3DImage を控えめに使用する
D3DImage インスタンスでホストされている Direct3D9 コンテンツは、純粋な Direct3D アプリケーションほど高速にレンダリングされません。 サーフェスをコピーしてコマンド バッファーをフラッシュすると、コストのかかる操作になる場合があります。 D3DImage インスタンスの数が増えると、フラッシュが増え、パフォーマンスが低下します。 そのため、D3DImage は控えめに使用する必要があります。
Windows Vista のベスト プラクティス
Windows ディスプレイ ドライバー モデル (WDDM) を使用するように構成されたディスプレイを備えた Windows Vista で最適なパフォーマンスを得るために、IDirect3DDevice9Ex
デバイスに Direct3D9 サーフェスを作成します。 これにより、サーフェスの共有が可能になります。 ビデオ カードは、Windows Vista の D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES
と D3DCAPS2_CANSHARERESOURCE
ドライバーの機能をサポートしている必要があります。 その他の設定を行うと、サーフェスがソフトウェア経由でコピーされるため、パフォーマンスが大幅に低下します。
手記
Windows Vista に Windows XP ディスプレイ ドライバー モデル (XDDM) を使用するように構成されたディスプレイがある場合、画面は設定に関係なく、常にソフトウェア経由でコピーされます。 適切な設定とビデオ カードを使用すると、サーフェス コピーがハードウェアで実行されるため、WDDM を使用すると Windows Vista のパフォーマンスが向上します。
Windows XP のベスト プラクティス
Windows XP ディスプレイ ドライバー モデル (XDDM) を使用する Windows XP で最適なパフォーマンスを得る場合は、IDirect3DSurface9::GetDC
メソッドが呼び出されたときに正しく動作するロック可能なサーフェスを作成します。 内部的には、BitBlt
メソッドはハードウェア内のデバイス間でサーフェスを転送します。 GetDC
メソッドは、常に XRGB サーフェスで動作します。 ただし、クライアント コンピューターが SP3 または SP2 で Windows XP を実行していて、クライアントにも階層ウィンドウ機能の修正プログラムがある場合、このメソッドは ARGB サーフェスでのみ機能します。 ビデオ カードは、D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES
ドライバー機能をサポートしている必要があります。
16 ビットデスクトップディスプレイの深さは、パフォーマンスを大幅に低下させることができます。 32 ビット デスクトップをお勧めします。
Windows Vista および Windows XP 用に開発している場合は、Windows XP でパフォーマンスをテストします。 Windows XP でビデオ メモリが不足することは懸念事項です。 さらに、Windows XP の D3DImage では、必要な追加のビデオ メモリ コピーにより、Windows Vista WDDM よりも多くのビデオ メモリと帯域幅が使用されます。 そのため、Windows XP では、同じビデオ ハードウェアの Windows Vista よりもパフォーマンスが低下する可能性があります。
手記
XDDM は、Windows XP と Windows Vista の両方で使用できます。ただし、WDDM は Windows Vista でのみ使用できます。
一般的なベスト プラクティス
デバイスを作成するときは、D3DCREATE_MULTITHREADED
作成フラグを使用します。 これによりパフォーマンスが低下しますが、WPF レンダリング システムは別のスレッドからこのデバイスのメソッドを呼び出します。 2 つのスレッドが同時にデバイスにアクセスしないように、ロック プロトコルに正しく従ってください。
レンダリングが WPF マネージド スレッドで実行される場合は、D3DCREATE_FPU_PRESERVE
作成フラグを使用してデバイスを作成することを強くお勧めします。 この設定がないと、D3D レンダリングによって WPF の倍精度操作の精度が低下し、レンダリングの問題が発生する可能性があります。
ハードウェアをサポートせずに pow2 以外のサーフェスをタイル表示する場合や、D3DImageを含む DrawingBrush または VisualBrush をタイル化する場合を除き、D3DImage のタイリングは高速です。
マルチモニター ディスプレイのベスト プラクティス
複数のモニターがあるコンピューターを使用している場合は、前述のベスト プラクティスに従う必要があります。 マルチモニター構成のパフォーマンスに関するその他の考慮事項もあります。
バック バッファーを作成すると、特定のデバイスとアダプターに作成されますが、WPF では、任意のアダプターにフロント バッファーを表示できます。 アダプター間でコピーしてフロント バッファーを更新すると、非常にコストがかかる場合があります。 複数のビデオ カードと IDirect3DDevice9Ex
デバイスで WDDM を使用するように構成されている Windows Vista では、フロント バッファーが別のアダプター上にあるが、それでも同じビデオ カード上にある場合、パフォーマンスの低下はありません。 ただし、Windows XP および複数のビデオ カードを備えた XDDM では、フロント バッファーがバック バッファーとは異なるアダプターに表示されると、パフォーマンスが大幅に低下します。 詳細については、「WPF と Direct3D9 相互運用」を参照してください。
パフォーマンスの概要
次の表は、オペレーティング システム、ピクセル形式、および表面ロック機能の機能としてのフロント バッファー更新のパフォーマンスを示しています。 フロント バッファーとバック バッファーは、同じアダプター上にあると見なされます。 アダプターの構成によっては、通常、ハードウェア更新プログラムはソフトウェア更新プログラムよりもはるかに高速です。
サーフェス ピクセル形式 | Windows Vista、WDDM、9Ex | その他の Windows Vista の構成 | Windows XP SP3 または SP2 (修正プログラム付き) | Windows XP SP2 |
---|---|---|---|---|
D3DFMT_X8R8G8B8 (ロック不可) | ハードウェア更新 | ソフトウェア更新プログラム | ソフトウェア更新プログラム | ソフトウェア更新プログラム |
D3DFMT_X8R8G8B8 (ロック可能) | ハードウェア更新 | ソフトウェア更新プログラム | ハードウェア更新のお知らせ | ハードウェア更新 |
D3DFMT_A8R8G8B8 (ロック不可) | ハードウェアアップデート | ソフトウェア更新プログラム | ソフトウェア更新プログラム | ソフトウェア更新プログラム |
D3DFMT_A8R8G8B8 (ロック可能) | ハードウェア更新 | ソフトウェア更新プログラム | ハードウェア更新 | ソフトウェア更新プログラム |
関連項目
- D3DImage
- WPF と Direct3D9 相互運用
- チュートリアル: WPF でのホスティング用の Direct3D9 コンテンツの作成
- チュートリアル: WPF での Direct3D9 コンテンツのホスト
.NET Desktop feedback