Platform SDK: DirectX |
DirectDraw のすべてのサーフェスは、フリッピング サーフェスとして構築される。フリッピング サーフェスとは、フロント バッファとバック バッファ間でスワップすることのできるメモリの一部にすぎない (通常、この構成要素はフリッピング チェーンと呼ばれる。) ほとんどの場合、フロント バッファはプライマリ サーフェスであるが、必ずしもそうである必要はない。
一般に、IDirectDrawSurface7::Flip メソッドを用いてサーフェス フリッピング処理を要求する場合、プライマリ サーフェスとバック バッファに対するサーフェス メモリへのポインタはスワップされる。フリッピングは、サーフェス メモリをコピーすることではなく、メモリを参照するためにディスプレイ デバイスの使用するポインタを切り替えることで実行される (DirectDraw がフリッピングをエミュレートしているときは例外である。この場合は、単にサーフェスをコピーする。バック バッファがディスプレイ メモリに適合しない場合や、ハードウェアが DirectDraw をサポートしない場合、DirectDraw はフリッピング処理をエミュレートする)。フリッピング チェーンにプライマリ サーフェスと 1 つ以上のバック バッファがある場合、次の図に示すように、ポインタは循環的パターンで切り替えられる。
一般に、DirectDrawSurface7.Flip メソッドを用いてサーフェス フリッピング処理を要求する場合、プライマリ サーフェスとバック バッファに対するサーフェス メモリはスワップされる。フリッピングは、サーフェス メモリをコピーすることではなく、メモリを参照するためにディスプレイ デバイスの使用するサーフェスを切り替えることで実行される (DirectDraw がフリッピングをエミュレートしているときは例外である。この場合は、単にサーフェスをコピーする。バック バッファがディスプレイ メモリに適合しない場合や、ハードウェアが DirectDraw をサポートしない場合、DirectDraw はフリッピング処理をエミュレートする)。フリッピング チェーンにプライマリ サーフェスと 1 つ以上のバック バッファがある場合、次の図に示すように、サーフェスは循環的パターンで切り替えられる。
DirectDraw オブジェクトにアタッチされているが、フリッピング チェーンの一部ではない他のサーフェスは、Flip メソッドが呼び出されても影響を受けない。
DirectDraw は、オブジェクト自体をスワップするのではなく、DirectDrawSurface オブジェクト内のサーフェス メモリ ポインタをスワップすることで、サーフェスのフリッピングを行うことを思い出すこと。このため、常に同じ DirectDrawSurface オブジェクト (すなわちフリッピング チェーンを作成したときにバック バッファであった DirectDrawSurface オブジェクト) を使用して、任意のタイプのフリッピング スキームでバック バッファにブリットする。反対に、常にフロントサーフェスの Flip メソッドを呼び出して、フリッピング処理を実行する。
プライマリ サーフェス フリッピング チェーンや表示されるオーバーレイ サーフェス フリッピング チェーンなどの表示されるサーフェスと共に作用する場合、DDFLIP_WAIT フラグが含まれていなければ Flip メソッドは非同期となる。このような表示されるサーフェスでは、ハードウェアで実際のフリッピング処理が生じる前に、Flip メソッドが戻る可能性がある (ハードウェアは次の垂直リフレッシュが起こるまで、フリッピングを行わないためである)。実際のフリッピング処理がペンディング中に、IDirectDrawSurface7::Lock、IDirectDrawSurface7::Blt、IDirectDrawSurface7::BltFast、または IDirectDrawSurface7::GetDC メソッドを呼び出して、現在表示されているサーフェスの背後のバック バッファをロックしたり、ブリットすることはできない。フリッピング処理がペンディング中にこれらのメソッドを呼び出そうとすると、失敗して DDERR_WASSTILLDRAWING を返す。ただし、トリプル バッファ スキームを使用している場合、最後のバッファは利用可能のままである。
DirectDraw は、オブジェクト自体をスワップするのではなく、DirectDrawSurface オブジェクト内のサーフェス メモリをスワップすることで、サーフェスのフリッピングを行うことを思い出すこと。このため、常に同じ DirectDrawSurface オブジェクト (すなわちフリッピング チェーンを作成したときにバック バッファであった DirectDrawSurface オブジェクト) を使用して、任意のタイプのフリッピング スキームでバック バッファにブリットする。反対に、常にフロントサーフェスの Flip メソッドを呼び出して、フリッピング処理を実行する。
プライマリ サーフェス フリッピング チェーンや表示されるオーバーレイ サーフェス フリッピング チェーンなどの表示されるサーフェスと共に作用する場合、DDFLIP_WAIT フラグが含まれていなければ Flip メソッドは非同期となる。このような表示されるサーフェスでは、ハードウェアで実際のフリッピング処理が生じる前に、Flip メソッドが戻る可能性がある (ハードウェアは次の垂直リフレッシュが起こるまで、フリッピングを行わないためである)。実際のフリッピング処理がペンディング中に、DirectDrawSurface7.Lock、DirectDrawSurface7.Blt、DirectDrawSurface7.BltColorFill、DirectDrawSurface7.BltFast、DirectDrawSurface7.BltFx、DirectDrawSurface7.BltToDC または DirectDrawSurface7.GetDC メソッドを呼び出して、現在表示されているサーフェスの背後のバック バッファをロックしたり、ブリットすることはできない。フリッピング処理がペンディング中にこれらのメソッドを呼び出そうとすると、失敗して DDERR_WASSTILLDRAWING を返す。ただし、トリプル バッファ スキームを使用している場合、最後のバッファは利用可能のままである。