D3DSWAPEFFECT 列挙

スワップ効果を定義します。

構文

typedef enum D3DSWAPEFFECT { 
  D3DSWAPEFFECT_DISCARD      = 1,
  D3DSWAPEFFECT_FLIP         = 2,
  D3DSWAPEFFECT_COPY         = 3,
  D3DSWAPEFFECT_OVERLAY      = 4,
  D3DSWAPEFFECT_FLIPEX       = 5,
  D3DSWAPEFFECT_FORCE_DWORD  = 0xFFFFFFFF
} D3DSWAPEFFECT, *LPD3DSWAPEFFECT;

定数

D3DSWAPEFFECT_DISCARD

スワップ チェーンがD3DSWAPEFFECT_FLIPまたはD3DSWAPEFFECT_COPYのスワップ効果で作成されると、ランタイムは IDirect3DDevice9::P resent 操作がバック バッファーの内容に影響しないことを保証します。 残念ながら、この保証を満たすには、特にウィンドウスワップチェーンのフリップセマンティクスまたは全画面表示スワップチェーンのコピーセマンティクスを実装する場合に、ビデオメモリや処理オーバーヘッドが大幅に発生する可能性があります。 アプリケーションでは、これらのオーバーヘッドを回避し、ディスプレイ ドライバーがスワップ チェーンの最も効率的なプレゼンテーション手法を選択できるようにするために、D3DSWAPEFFECT_DISCARDスワップ効果を使用できます。 これは、D3DPRESENT_PARAMETERSの MultiSampleType メンバーにD3DMULTISAMPLE_NONE 以外の値を指定するときに使用できる唯一のスワップ効果でもあります。

D3DSWAPEFFECT_FLIPを使用するスワップ チェーンと同様に、D3DSWAPEFFECT_DISCARDを使用するスワップ チェーンには複数のバック バッファーが含まれる場合があり、そのいずれも IDirect3DDevice9::GetBackBuffer または IDirect3DSwapChain9::GetBackBuffer を使用してアクセスできます。 スワップ チェーンは、次の Present 操作によって表示されるバック バッファーのインデックスを常に 0 に設定し、バッファーが表示されたときに破棄されるキューとして最適です。

このスワップ効果を使用するアプリケーションでは、破棄されたバック バッファーの内容について何も想定できないため、表示される Present 操作を呼び出す前にバック バッファー全体を更新する必要があります。 これは適用されませんが、ランタイムのデバッグ バージョンでは、破棄されたバック バッファーの内容がランダムなデータで上書きされ、開発者はアプリケーションがバック バッファー サーフェス全体を正しく更新していることを確認できます。

D3DSWAPEFFECT_FLIP

スワップ チェーンには複数のバック バッファーが含まれる場合があり、フロント バッファーを含む循環キューとして最適です。 このキュー内では、バック バッファーには常に 0 から (n - 1) の順に番号が付けられます。ここで、n はバック バッファーの数です。そのため、0 は最も新しく提示されたバッファーを表します。 Present が呼び出されると、キューが "回転" され、フロント バッファーがバック バッファー (n - 1) になり、バック バッファー 0 が新しいフロント バッファーになります。

D3DSWAPEFFECT_COPY

このスワップ効果は、1 つのバック バッファーを含むスワップ チェーンに対してのみ指定できます。 スワップ チェーンがウィンドウ化されているか全画面表示であるかに関係なく、ランタイムは、コピーベースの Present 操作によって暗黙的なセマンティクスを保証します。つまり、バック バッファーの内容は変更されず、フリップベースの Present 操作としてフロント バッファーの内容に置き換えるのではなく残されます。

全画面表示のスワップ チェーンの場合、ランタイムは反転操作とコピー操作の組み合わせを使用します。この操作は、非表示のバック バッファーで必要に応じてサポートされます。 したがって、プレゼンテーションはディスプレイ アダプターの垂直リトレースと同期され、そのレートは選択したプレゼンテーション間隔によって制限されます。 D3DPRESENT_INTERVAL_IMMEDIATE フラグで指定されたスワップ チェーンだけが例外です。 (D3DPRESENT_PARAMETERS構造体の PresentationIntervals メンバーの説明を参照してください。この場合、Present 操作は、垂直方向のリトレースを待たずにバック バッファーの内容をフロント バッファーに直接コピーします。

D3DSWAPEFFECT_OVERLAY

プライマリ サーフェスにオーバーレイできるビデオ メモリの専用領域を使用します。 オーバーレイが表示されている場合、コピーは実行されません。 オーバーレイ操作は、プライマリ サーフェスのデータを変更せずに、ハードウェアで実行されます。

Direct3D 9 と Direct3D 9Ex の違い:

  • D3DSWAPEFFECT_OVERLAYは、Windows 7 (またはそれ以上の現在のオペレーティング システム) で実行されている Direct3D9Ex でのみ使用できます。

D3DSWAPEFFECT_FLIPEX

アプリケーションが反転モードを採用するタイミングを指定します。その間、アプリケーションがウィンドウ モードで表示されているときに、コンポジションのためにデスクトップ ウィンドウ マネージャー (DWM) にコピーされるのではなく、アプリケーションのフレームが渡されます。 フリップ モードを使用すると、アプリケーションでメモリ帯域幅をより効率的に使用できるだけでなく、アプリケーションが全画面表示の統計を利用できるようになります。 反転モードは、全画面表示の動作には影響しません。

Note

D3DSWAPEFFECT_FLIPEXを使用してスワップ チェーンを作成した場合、表示する新しいフレームを提示するときに、D3DPRESENT_PARAMETERS構造体の hDeviceWindow メンバーをオーバーライドすることはできません。 つまり、プレゼンテーションに D3DPRESENT_PARAMETERS の hDeviceWindow メンバーを使用するようにランタイムに指示するには、IDirect3DDevice9Ex::P resentExhDestWindowOverride パラメーターNULL を渡す必要があります。

Direct3D 9 と Direct3D 9Ex の違い:

  • D3DSWAPEFFECT_FLIPEXは、Windows 7 (またはそれ以上の現在のオペレーティング システム) で実行されている Direct3D9Ex でのみ使用できます。

D3DSWAPEFFECT_FORCE_DWORD

この列挙を強制的に 32 ビットのサイズにコンパイルします。 この値がないと、一部のコンパイラでは、この列挙を 32 ビット以外のサイズにコンパイルできます。 この値は使用されません。

解説

Present の呼び出し後のバック バッファーの状態は、これらの各スワップ効果によって明確に定義され、Direct3D デバイスが全画面表示のスワップ チェーンで作成されたか、ウィンドウ化されたスワップ チェーンを使用して作成されたかは、この状態には影響しません。 特に、D3DSWAPEFFECT_FLIPスワップ効果は、ウィンドウまたは全画面表示のどちらでも同じように動作し、Direct3D ランタイムは追加のバッファーを作成することでこれを保証します。 その結果、このようなペナルティを回避するために、可能な限りアプリケーションでD3DSWAPEFFECT_DISCARDを使用することをお勧めします。 これは、このスワップ効果は、メモリ消費量とパフォーマンスの観点から常に最も効率的であるためです。

D3DSWAPEFFECT_FLIPまたはD3DSWAPEFFECT_DISCARDを使用するアプリケーションでは、全画面表示の宛先アルファが機能することを想定しないでください。 つまり、これらのスワップ効果を持つ全画面表示のスワップ チェーンにはドライバーの観点から明示的なピクセル形式がないため、D3DRS_DESTBLENDのレンダリング状態は期待どおりに機能しません。 ドライバーは、アルファ チャネルを持たない表示形式を使用する必要があると推測します。 これを回避するには、次の手順を実行します。

  • D3DSWAPEFFECT_COPYを使用します。
  • D3DCAPS9 構造体の Caps3 メンバーのD3DCAPS3_ALPHA_FULLSCREEN_FLIP_OR_DISCARD フラグを確認します。 このフラグは、ドライバーがD3DSWAPEFFECT_FLIPまたはD3DSWAPEFFECT_DISCARDを使用するときにアルファ ブレンドを実行できるかどうかを示します。
  • 反転モードのスワップ効果 (D3DSWAPEFFECT_FLIPEX) を使用するアプリケーションでは、ウィンドウのサイズ変更または領域の変更後に PresentEx を呼び出して、表示コンテンツが確実に更新されるようにする必要があります。

非表示ウィンドウでは、ユーザー モード イベントを受信できません。さらに、非表示の全画面表示ウィンドウは、別のアプリケーションのウィンドウ モード ウィンドウの表示に干渉します。 そのため、各アプリケーションでは、スワップチェーンが全画面表示モードで表示されるときに、デバイス ウィンドウが確実に表示されるようにする必要があります。

要件

要件
ヘッダー
D3D9Types.h

関連項目

Direct3D 列挙

IDirect3DDevice9::Reset