D3DSWAPEFFECT 列挙型

D3DSWAPEFFECT 列挙型

スワップ エフェクトを定義する。

構文

typedef enum _D3DSWAPEFFECT {
    D3DSWAPEFFECT_DISCARD = 1,
    D3DSWAPEFFECT_FLIP = 2,
    D3DSWAPEFFECT_COPY = 3,
    D3DSWAPEFFECT_FORCE_DWORD = 0xFFFFFFFF
} D3DSWAPEFFECT;

定数

  • D3DSWAPEFFECT_DISCARD
    スワップ エフェクトの D3DSWAPEFFECT_FLIP または D3DSWAPEFFECT_COPY を使ってスワップ チェーンを作成した場合、ランタイムは IDirect3DDevice9::Present 処理がバック バッファの内容に影響しないことを保証する。ただし、特にウィンドウ スワップ チェーンのフリップ セマンティクスや、フルスクリーン スワップ チェーンのコピー セマンティスクを実装する場合は、この保証を満たすためにかなりのビデオ メモリのオーバーヘッドや処理のオーバーヘッドを伴うことがある。アプリケーションは D3DSWAPEFFECT_DISCARD スワップ エフェクトを使うことで、これらのオーバーヘッドを回避することができ、最も効率的なスワップ チェーンの表現方法をディスプレイ ドライバ側で選択できる。また、これは、D3DPRESENT_PARAMETERSMultiSampleType メンバに 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
    このスワップ エフェクトは、単一のバック バッファを構成するスワップ チェーンに対してのみ指定できる。ウィンドウ スワップ チェーンの場合もフルスクリーン スワップ チェーンの場合も、ランタイムはコピーベースの Present 処理によるセマンティクスを保証する。つまり、バック バッファの内容が変更されることはなく、フリップベースの Present 処理で行われるようにフロント バッファの内容で置き換えられることはない。

    フルスクリーン スワップ チェーンの場合、ランタイムはフリップ処理とコピー処理の組み合わせ (必要に応じて、隠しバック バッファでサポートされる) を使って Present 処理を行う。したがって、プレゼンテーションはディスプレイ アダプタの垂直帰線と同期され、その速度は選択されたプレゼンテーション間隔によって制御される。ただし、D3DPRESENT_INTERVAL_IMMEDIATE フラグで指定されたスワップ チェーンは例外である。D3DPRESENT_PARAMETERS 構造体の FullScreen_PresentationInterval メンバの説明を参照すること。この場合、Present 処理は垂直帰線を待機せずに、バック バッファの内容をフロント バッファに直接コピーする。

  • D3DSWAPEFFECT_FORCE_DWORD
    この列挙型を強制的に 32 ビット サイズにコンパイルする。この値は使われていない。

注意

Present を呼び出した後のバック バッファの状態は、各スワップ エフェクトによって明確に定義されており、Microsoft® 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 を使う場合に、ドライバがアルファ ブレンディングを行えるかどうかを示す。

列挙型の情報

ヘッダー d3d9types.h
最低限のオペレーティング システム Windows 98

参照

IDirect3DDevice9::ResetD3DPRESENT_PARAMETERS