Microsoft DirectX 8.0 (C++)

フリッピング サーフェス

Microsoft® Direct3D® アプリケーションは、通常、バック バッファにアニメーションのフレームを生成し、連続して提示することで、アニメーションを表示する。バック バッファはスワップ チェーンに分割される。スワップ チェーンとは、スクリーンに順に “フリップ” する一連のバッファのことである。このスワップ チェーンを使用すると、メモリ内のあるシーンをレンダリングし、レンダリングが完了したらそのシーンをスクリーンにフリップできる。これで、テアリングと呼ばれる現象を防ぎ、より滑らかなアニメーションが得られる。

Direct3D で作成された各デバイスは、スワップ チェーンを少なくとも 1 つは持っている。最初の Direct3D デバイスを初期化するときに、スワップ チェーン内にあるバック バッファの数を Direct3D に指示する D3DPRESENT_PARAMETERS 構造体の BackBufferCount メンバを設定する。IDirect3D8::CreateDevice を呼び出し、次に、Direct3D デバイスおよび対応するスワップ チェーンを作成する。

IDirect3DDevice8::Present メソッドを用いてサーフェス フリッピング処理を要求する場合、フロント バッファとバック バッファに対するサーフェス メモリへのポインタはスワップされる。フリッピングは、サーフェス メモリをコピーすることではなく、メモリを参照するためにディスプレイ デバイスの使用するポインタを切り替えることで実行される。フリッピング チェーンにフロント バッファと 1 つ以上のバック バッファがある場合、次の図に示すように、ポインタは循環的パターンで切り替えられる。

デバイスの追加スワップ チェーンを作成するには、IDirect3DDevice8::CreateAdditionalSwapChain を呼び出す。アプリケーションはビューごとに 1 つのスワップ チェーンを作成し、そのスワップ チェーンを特定のウィンドウに関連付ける。アプリケーションでは、各スワップ チェーンのバック バッファに画像をレンダリングし、次にそれを個別に提示する。CreateAdditionalSwapChain が受け取る 2 つのパラメータは、D3DPRESENT_PARAMETERS 構造体へのポインタと IDirect3DSwapChain8 インターフェイスへのポインタのアドレスである。次に、IDirect3DSwapChain8::Present を使用して、次のバック バッファの内容をフロント バッファに表示する。各デバイスはフルスクリーン スワップ チェーンを 1 つしか持てないことに注意すること。

特定のバック バッファへアクセスするには、IDirect3DDevice8::GetBackBuffer メソッドまたは IDirect3DSwapChain8::GetBackBuffer メソッドを呼び出す。これらのメソッドは、返されるバック バッファ サーフェスを表す IDirect3DSurface8 インターフェイスへのポインタを返す。このメソッドを呼び出すと、IDirect3DDevice8 インターフェイスの内部参照カウントが増えるので、このサーフェスを使用した後は、必ず IUnknown::Release を呼び出すよう注意すること。呼び出さないと、メモリ リークが起こる。

Direct3D は、サーフェス自体をスワップするのではなく、スワップ チェーン内のサーフェス メモリ ポインタをスワップすることで、サーフェスのフリッピングを行うことを思い出すこと。つまり、次に表示されるバック バッファに対して常にレンダリングするということである。

ディスプレイ アダプタ ドライバによって行われる "フリッピング処理" と、D3DSWAPEFFECT_FLIP を使用して作成されたスワップ チェーンに適用される "Present" 処理には、明らかな違いがあることに注意することが大切である。

一般に "フリップ" という用語は、ディスプレイ アダプタがその出力信号を生成するために使用するビデオ メモリのアドレス範囲を変更する処理のことであり、これによって隠しバック バッファの内容が表示される。DirectX 8 の場合、この用語は、D3DSWAPEFFECT_FLIP スワップ エフェクトで作成されたスワップ チェーンにおけるバック バッファのプレゼンテーションのことを表すために、より一般的に使用される。

スワップ チェーンがフルスクリーンの場合に "Present" 処理がほとんど常にフリップ処理によって実装されるとき、これらの処理はスワップ チェーンがウィンドウの際に必ずコピー処理によって実装される。さらに、ディスプレイ アダプタ ドライバは、D3DSWAPEFFECT_DISCARD、D3DSWAPEFFECT_COPY、および D3DSWAPEFFECT_COPY_VSYNC スワップ チェーンに基づくフルスクリーン スワップ チェーンに対して Present 処理を実装するためにフリッピングを使用できる。

これまでの説明は、D3DSWAPEFFECT_FLIP で作成されたフルスクリーン スワップ チェーンを使用する一般的なケースに適用される。

ウィンドウ スワップ チェーンおよびフルスクリーン スワップ チェーンの異なるスワップ エフェクトの一般的な説明については、「D3DSWAPEFFECT」を参照すること。