Microsoft DirectX 8.0 (C++)

D3DSWAPEFFECT

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

typedef enum _D3DSWAPEFFECT {
    D3DSWAPEFFECT_DISCARD         = 1,
    D3DSWAPEFFECT_FLIP            = 2,
    D3DSWAPEFFECT_COPY            = 3,
    D3DSWAPEFFECT_COPY_VSYNC      = 4,

    D3DSWAPEFFECT_FORCE_DWORD     = 0xFFFFFFFF
} D3DSWAPEFFECT;

定数

D3DSWAPEFFECT_DISCARD
スワップ エフェクトの D3DSWAPEFFECT_FLIP、D3DSWAPEFFECT_COPY、または D3DSWAPEFFECT_COPY_VSYNC を使ってスワップ チェーンを作成した場合、ランタイムは IDirect3DDevice8::Present 処理がバック バッファの内容に一切影響しないことを保証する。ただし、ウィンドウ スワップ チェーンのフリップ セマンティクスや、フルスクリーン スワップ チェーンのコピー セマンティクスを実装する際などには、この保証を満たすためにかなりのビデオ メモリのオーバーヘッドや処理のオーバーヘッドが伴うことがある。アプリケーションでは D3DSWAPEFFECT_DISCARD スワップ エフェクトを使うことで、これらのオーバーヘッドを回避することができ、最も効率的なスワップ チェーンの表現方法をディスプレイ ドライバ側で選択できる。また、これは、D3DPRESENT_PARAMETERSMultiSampleType メンバに D3DMULTISAMPLE_NONE 以外の値を指定した際に使用できる唯一のスワップ エフェクトである。

D3DSWAPEFFECT_FLIP を使用するスワップ チェーンと同様、D3DSWAPEFFECT_DISCARD を使用するスワップ チェーンは複数のバック バッファを含んでいることがあり、これらのバッファには IDirect3DDevice8::GetBackBuffer または IDirect3DSwapChain8::GetBackBuffer を使ってアクセスできる。スワップ チェーンは待ち行列として見なすことができ、この待ち行列の中では、次の Present 処理で表示されるバック バッファに常にインデックス 0 が付き、いったん表示されたバッファは待ち行列から破棄される。

このスワップ エフェクトを使用するアプリケーションでは、破棄されるバック バッファの内容を推測することはできないため、バック バッファ全体を更新した後で Present 処理を呼び出す必要がある。これは強制的なことではないが、デバッグ バージョンのランタイムは、破棄されるバック バッファの内容を任意のデータで上書きできるので、開発者はアプリケーションがバック バッファ サーフェス全体を正しく更新していることを確認できる。

フルスクリーン スワップ チェーンの場合、デバイスまたはスワップ チェーンの作成時に D3DPRESENT_PARAMETERS 構造体の FullScreen_PresentationInterval メンバに割り当てられた値によってプレゼンテーション レートが決まる。この値が D3DPRESENT_INTERVAL_IMMEDIATE でない場合、プレゼンテーションはモニタの垂直同期と同期される。ウィンドウ スワップ チェーンの場合、プレゼンテーションはコピー処理によって実装されて、常に即座に実行される。

D3DSWAPEFFECT_FLIP
スワップ チェーンには複数のバック バッファが含まれることがあり、フロント バッファを含む巡回待ち行列として見なすことができる。この待ち行列の中では、バック バッファに常に 0 から N -1 (N はバック バッファの数) までの連続した数字が付けられる。したがって、0 はプレゼンテーションされる最も古いバッファを示す。Present が呼び出されると、待ち行列が「循環」されて、フロント バッファがバック バッファ (N - 1) になり、バック バッファ 0 が新しいフロント バッファになる。

フルスクリーン スワップ チェーンの場合、デバイスまたはスワップ チェーンの作成時に D3DPRESENT_PARAMETERS 構造体の FullScreen_PresentationInterval メンバに割り当てられた値によってプレゼンテーション レートが決まる。この値が D3DPRESENT_INTERVAL_IMMEDIATE でない場合、プレゼンテーションはモニタの垂直同期と同期される。ウィンドウ スワップ チェーンの場合、フリッピングはコピー処理によって実装され、プレゼンテーションは常に即座に実行される。

D3DSWAPEFFECT_COPY
スワップ エフェクトは、単一のバック バッファを構成するスワップ チェーンに対してのみ指定できる。ウィンドウ スワップ チェーンの場合もフルスクリーン スワップ チェーンの場合も、ランタイムはコピーベースの Present 処理によるセマンティクスを保証する。つまり、バック バッファの内容が変更されることはなく、フリップベースの Present 処理で行われるようにフロント バッファの内容で置き換えられることはない。

ウィンドウ スワップ チェーンの場合、Present 処理によってバック バッファの内容がターゲット ウィンドウのクライアント領域に即座にコピーされる。コピー内容とディスプレイ アダプタの垂直帰線間隔との同期処理は行われないため、「テアリング」効果が現れることがある。ウィンドウ アプリケーションでは、そのようなテアリング効果を消したり最小限に抑えるために、D3DSWAPEFFECT_COPY_VSYNC を使うことができる。

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

D3DSWAPEFFECT_COPY_VSYNC
D3DSWAPEFFECT_COPY と同様、このスワップ エフェクトは、単一のバック バッファで構成されるスワップ チェーンでのみ使用できる。上の D3DSWAPEFFECT_COPY で説明したように、スワップ チェーンに適用される Present 処理がコピー セマンティクスを提示することが保証される。

ウィンドウ スワップ チェーンの場合、Present 処理によってバック バッファの内容がターゲット ウィンドウのクライアント領域に即座にコピーされる。アダプタがディスプレイ上の転送先の矩形内でスキャンしている間、ランタイムはコピー処理を避けてテアリング効果を排除しようとする。また、ランタイムは、アダプタのリフレッシュ間隔の間にコピー処理をせいぜい 1 回実行して、プレゼンテーションの頻度を制限する。ただし、アダプタがラスタ ステータスの報告機能をサポートしていない場合には、スワップ チェーンは D3DSWAPEFFECT_COPY スワップ エフェクトで作成されたかのような働きをする。(D3DCAPS8Caps メンバについては、D3DCAPS_READ_SCANLINE フラグ値の説明を参照すること)。

フルスクリーン スワップ チェーンの場合、D3DSWAPEFFECT_COPY_VSYNC は D3DSWAPEFFECT_COPY と同じである。ただし、D3DPRESENT_INTERVAL_IMMEDIATE フラグは、D3DSWAPEFFECT_COPY_VSYNC と共に使用した場合には何も効果がない。(D3DPRESENT_PARAMETERS 構造体の FullScreen_PresentationInterval メンバの説明を参照すること)。

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

注意

Present を呼び出した後のバック バッファの状態は、各スワップ エフェクトによって明確に定義されており、Microsoft®Direct3D® デバイスがフルスクリーン スワップ チェーンとウィンドウ スワップ チェーンのどちらで作成されたかによって、この状態が影響を受けることはない。特に、D3DSWAPEFFECT_FLIP スワップ エフェクトはウィンドウでもフルスクリーンでも同じように動作し、Direct3D ランタイムは外部バッファを作成することでこれを保証している。結果として、そのような悪影響を回避できる場合には、常にアプリケーションで D3DSWAPEFFECT_DISCARD を使うことを推奨する。メモリの消費およびパフォーマンスの点において、このスワップ チェーンは常に最も効率的であることが理由である。

動作環境

  ヘッダー : D3d8types.h で宣言。

参照

IDirect3DDevice8::ResetD3DPRESENT_PARAMETERS