サーフェイスのフリップ

サーフェイスのフリップ

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

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

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

3 つのフリップ

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

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

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

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

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

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

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

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