Microsoft DirectX 8.0 (Visual Basic) |
Enum CONST_D3DSWAPEFFECT D3DSWAPEFFECT_DISCARD = 1 D3DSWAPEFFECT_FLIP = 2 D3DSWAPEFFECT_COPY = 3 D3DSWAPEFFECT_COPY_VSYNC = 4 End Enum
D3DSWAPEFFECT_FLIP を使用するスワップ チェーンと同様、D3DSWAPEFFECT_DISCARD を使用するスワップ チェーンは複数のバック バッファを含んでいることがあり、これらのバッファには Direct3DDevice8.GetBackBuffer または Direct3DSwapChain8.GetBackBuffer を使ってアクセスできる。スワップ チェーンは待ち行列として見なすことができ、この待ち行列の中では、次の Present 処理で表示されるバック バッファに常にインデックス 0 が付き、いったん表示されたバッファは待ち行列から破棄される。
このスワップ エフェクトを使用するアプリケーションでは、破棄されるバック バッファの内容を推測することはできないため、バック バッファ全体を更新した後で Present 処理を呼び出す必要がある。これは強制的なことではないが、デバッグ バージョンのランタイムは、破棄されるバック バッファの内容を任意のデータで上書きできるので、開発者はアプリケーションがバック バッファ サーフェス全体を正しく更新していることを確認できる。
フルスクリーン スワップ チェーンの場合、デバイスまたはスワップ チェーンの作成時に D3DPRESENT_PARAMETERS 構造体の FullScreen_PresentationInterval メンバに割り当てられた値によってプレゼンテーション レートが決まる。この値が D3DPRESENT_INTERVAL_IMMEDIATE でない場合、プレゼンテーションはモニタの垂直同期と同期される。ウィンドウ スワップ チェーンの場合、プレゼンテーションはコピー処理によって実装されて、常に即座に実行される。
フルスクリーン スワップ チェーンの場合、デバイスまたはスワップ チェーンの作成時に D3DPRESENT_PARAMETERS 構造体の FullScreen_PresentationInterval フィールドに割り当てられた値によってプレゼンテーション レートが決まる。この値が D3DPRESENT_INTERVAL_IMMEDIATE でない場合、プレゼンテーションはモニタの垂直同期と同期される。ウィンドウ スワップ チェーンの場合、フリッピングはコピー処理によって実装され、プレゼンテーションは常に即座に実行される。
ウィンドウ スワップ チェーンの場合、Present 処理によってバック バッファの内容がターゲット ウィンドウのクライアント領域に即座にコピーされる。コピー内容とディスプレイ アダプタの垂直帰線間隔との同期処理は行われないため、"テアリング" 効果が現れることがある。ウィンドウ アプリケーションでは、そのようなテアリング効果を消したり最小限に抑えるために、D3DSWAPEFFECT_COPY_VSYNC を使うことができる。
フルスクリーン スワップ チェーンの場合、ランタイムはフリップ処理とコピー処理の組み合わせ (必要に応じて、隠しバック バッファでサポートされる) を使って Present 処理を行う。したがって、プレゼンテーションはディスプレイ アダプタの垂直帰線と同期され、そのレートは選択されたプレゼンテーション間隔によって制御される。ただし、D3DPRESENT_INTERVAL_IMMEDIATE フラグで指定されたスワップ チェーンは例外である。D3DPRESENT_PARAMETERS 構造体の FullScreen_PresentationInterval メンバの説明を参照すること。この場合、Present 処理は垂直帰線を待機せずに、バック バッファの内容をフロント バッファに直接コピーする。
ウィンドウ スワップ チェーンの場合、Present 処理によってバック バッファの内容がターゲット ウィンドウのクライアント領域に即座にコピーされる。アダプタがディスプレイ上の転送先の矩形内でスキャンしている間、ランタイムはコピー処理を避けてテアリング効果を排除しようとする。また、ランタイムは、アダプタのリフレッシュ間隔の間にコピー処理をせいぜい 1 回実行して、プレゼンテーションの頻度を制限する。ただし、アダプタがラスタ ステータスの報告機能をサポートしていない場合には、スワップ チェーンは D3DSWAPEFFECT_COPY スワップ エフェクトで作成されたかのような働きをする。D3DCAPS8 の Caps メンバについては、D3DCAPS_READ_SCANLINE フラグ値の説明を参照すること。
フルスクリーン スワップ チェーンの場合、D3DSWAPEFFECT_COPY_VSYNC は D3DSWAPEFFECT_COPY と同じである。ただし、D3DPRESENT_INTERVAL_IMMEDIATE フラグは、D3DSWAPEFFECT_COPY_VSYNC と共に使用した場合には何も効果がない。D3DPRESENT_PARAMETERS 構造体の FullScreen_PresentationInterval メンバの説明を参照すること。
Present を呼び出した後のバック バッファの状態は、各スワップ エフェクトによって明確に定義されており、Microsoft® Direct3D® デバイスがフルスクリーン スワップ チェーンとウィンドウ スワップ チェーンのどちらで作成されたかによって、この状態が影響を受けることはない。特に、D3DSWAPEFFECT_FLIP スワップ エフェクトはウィンドウでもフルスクリーンでも同じように動作し、Direct3D ランタイムは外部バッファを作成することでこれを保証している。結果として、そのような悪影響を回避できる場合には、常にアプリケーションで D3DSWAPEFFECT_DISCARD を使うことを推奨する。メモリの消費およびパフォーマンスのポイントにおいて、このスワップ チェーンは常に最も効率的であることが理由である。