サーフェスの反転 (Direct3D 9)

通常、Direct3D アプリケーションは、バック バッファーのアニメーションのフレームを生成し、これらを順番に表示することで、アニメーション化されたシーケンスを表示します。バック バッファーはスワップ チェーンに編成されます。スワップ チェーンとは、シーンを次々と "反転" する一連のバッファーです。スワップ チェーンを使用すると、メモリー内の 1 つのシーンをレンダリングし、レンダリングが完了したら、シーンを画面に反転することができます。これによってテアリングと呼ばれる現象を回避し、スムーズなアニメーションが実現されます。

Direct3D で作成される各デバイスは、スワップ チェーンを 1 つ以上持ちます。Direct3D の初期化時に、D3DPRESENT_PARAMETERS の BackBufferCount メンバーを設定してください。このメンバーは、スワップ チェーン内に入るバック バッファーの数を Direct3D に知らせます。IDirect3D9::CreateDevice への呼び出しによって、Direct3D デバイスと対応するスワップ チェーンが作成されます。

IDirect3DDevice9::Present を使用してサーフェス反転処理を要求すると、フロント バッファーとバック バッファーのサーフェス メモリーへのポインターがスワップされます。反転はサーフェス メモリーをコピーするのではなく、ポインターを切り替えることで実行されます。表示デバイスは、これをメモリーの参照に使用します。チェーンの反転がフロント バッファーと複数のバック バッファーを含む場合、次の図に示すようにポインターは循環パターンで切り替えられます。

Triple flip

IDirect3DDevice9::CreateAdditionalSwapChain を呼び出すことで、デバイスに追加のスワップ チェーンを作成できます。アプリケーションはビューごとに 1 つのスワップ チェーンを作成し、各スワップ チェーンを特定のウィンドウに関連付けることができます。アプリケーションは各スワップ チェーンのバック バッファーでイメージをレンダリングし、イメージを個々に表示します。IDirect3DDevice9::CreateAdditionalSwapChain が受け取る 2 つのパラメーターは、D3DPRESENT_PARAMETERS 構造体へのポインター、そして IDirect3DSwapChain9 インターフェイスへのポインターのアドレスです。次に IDirect3DSwapChain9::Present を使用してフロント バッファーへの次のバック バッファーのコンテンツを表示できます。デバイスは全画面スワップ チェーンを 1 つだけ持つことができます。

特定のバック バッファーには、IDirect3DDevice9::GetBackBuffer メソッドまたは IDirect3DSwapChain9::GetBackBuffer メソッドを呼びだすことでアクセスできます。これらのメソッドは返されるバック バッファーのサーフェスを表す IDirect3DSurface9 インターフェイスへのポインターを返します。このメソッドの呼び出しによって、IDirect3DDevice9 インターフェイスに対する内部リファレンス カウントが増加するので、このサーフェスの使用を終了した場合は必ず IUnknown を呼び出します。そうしないとメモリー リークが発生します。

Direct3D は、サーフェスそのものを交換するのではなく、スワップ チェーン内のサーフェス メモリーのポインターを交換することで、サーフェスを反転します。つまり、常に次に表示されるバック バッファーをレンダリングすることになります。

ディスプレイ アダプター ドライバーによって実行される "反転処理" と、D3DSWAPEFFECT_FLIP によって作成されるスワップ チェーンに適用される "Present" 処理との違いを忘れないでください。

"反転" という用語は、従来はディスプレイ アダプターがその出力信号を生成するために使用するビデオ メモリー アドレスの範囲を変更し、前に非表示になっていたバック バッファーのコンテンツを表示させる処理を示します。Direct3D では、この用語は、D3DSWAPEFFECT_FLIP スワップ エフェクトで作成されるスワップ チェーンにおいてバック バッファーの表示を記述するために使用されることがほとんどです。

そのような "Present" 処理は、スワップ チェーンが全画面の場合にはほとんどと言っていいほど反転処理によって実装されますが、スワップ チェーンがウィンドウ表示されている場合は必然的にコピー処理によって実装されます。さらに、表示アダプター ドライバーは、D3DSWAPEFFECT_DISCARD と D3DSWAPEFFECT_COPY に基づいて、全画面スワップ チェーンに対する Present 処理の実装に反転を使用することがあります。

上記の説明は、D3DSWAPEFFECT_FLIP で作成される全画面スワップ チェーンの一般的な使用例にもあてはまります。

ウィンドウ表示と全画面表示の両方のスワップチェーンに関する各種スワップ エフェクトの詳細は、「D3DSWAPEFFECT」を参照してください。