Platform SDK: DirectX

トリプル バッファリング

[C++]

ある特定の状況、すなわちディスプレイ アダプタに十分なメモリがある場合には、トリプル バッファリングにより、アプリケーションの表示処理を高速化できる。トリプル バッファリングは、1 つのプライマリ サーフェスと 2 つのバック バッファを使用する。次の例で、トリプル バッファリング スキームを初期化する方法を示す。

// lpDDSPrimary と lpDDSBack 変数は、グローバルに宣言した
// 初期化していない LPDIRECTDRAWSURFACE4 変数である。
//
// lpDD 変数は、IDirectDraw4 インターフェイスへのポインタである。
 
DDSURFACEDESC2 ddsd;
ZeroMemory (&ddsd, sizeof(ddsd));
 
// 2 つのバック バッファと共にプライマリ サーフェスを作成する。
ddsd.dwSize = sizeof(ddsd); 
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; 
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | 
    DDSCAPS_FLIP | DDSCAPS_COMPLEX; 
ddsd.dwBackBufferCount = 2; 
ddrval = lpDD->CreateSurface(&ddsd, &lpDDSPrimary, NULL); 
 
// フリッピング チェーンの作成に成功すると、
// フリッピングやブリットに必要な
// サーフェスへのポインタを取得する。
if(ddrval == DD_OK) 
{ 
// プライマリ (バック バッファ) に直接アタッチされる // サーフェスを取得する。
    ddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER; 
    ddrval = lpDDSPrimary->GetAttachedSurface(&ddsd.ddsCaps, 
        &lpDDSBack); 
    if(ddrval != DD_OK) ;
// ここでエラー メッセージを表示する。
} 

トリプル バッファのフリッピング チェーンにあるサーフェスについて、そのすべてを調査する必要はない。保持していなければならないのは、プライマリ サーフェスとバックバッファ サーフェスへのポインタだけである。プライマリ サーフェスへのポインタは、フリッピング チェーンのサーフェスをフリップするために必要となる。また、バック バッファへのポインタは、ブリットのために必要である。詳細については、「フリッピング サーフェス」を参照すること。

フリッピングが終了せずに、バック バッファのブリットが既に終了している場合、トリプル バッファリングにより、アプリケーションはバック バッファにブリットし続けることができる。フリッピングの実行は同期イベントではない。つまり、あるフリッピングに他のフリッピング以上の時間をとることができる。このため、アプリケーションが 1 つのバック バッファだけを使う場合、IDirectDrawSurface7::Flip メソッドが DD_OK を返すまで待つ間、アイドリング時間がかかる可能性がある。

[Visual Basic]

ある特定の状況、すなわちディスプレイ アダプタに十分なメモリがある場合には、トリプル バッファリングにより、アプリケーションの表示処理を高速化できる。トリプル バッファリングは、1 つのプライマリ サーフェスと 2 つのバック バッファを使用する。次の例で、トリプル バッファリング スキームを初期化する方法を示す。

' DDSPrimary と DDSBack 変数は、
' グローバルに宣言した DIRECTDRAWSURFACE7 変数である。
'
' DD 変数は、DirectDraw7 オブジェクトである。
 
Dim ddsd As DDSURFACEDESC2
 
' 2 つのバック バッファと共にプライマリ サーフェスを作成する。
ddsd.lFlags = DDSD_CAPS Or DDSD_BACKBUFFERCOUNT
ddsd.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE Or _
DDSCAPS_FLIP Or DDSCAPS_COMPLEX
ddsd.lBackBufferCount = 2
DDSPrimary = DD.CreateSurface(ddsd)
 
' フリッピング チェーンの作成に成功すると、
' フリッピングとブリットに必要なサーフェスを取得する。
' プライマリ (バック バッファ) に直接アタッチされるサーフェスを取得する。
ddsd.ddsCaps.lCaps = DDSCAPS_BACKBUFFER
DDSBack = DDSPrimary.GetAttachedSurface(ddsd.ddsCaps)

トリプル バッファのフリッピング チェーンにあるサーフェスについて、そのすべてを調査する必要はない。保持していなければならないのは、プライマリ サーフェスとバックバッファ サーフェスへのポインタだけである。プライマリ サーフェスへのポインタは、フリッピング チェーンのサーフェスをフリップするために必要となる。また、バック バッファへのポインタは、ブリットのために必要である。詳細については、「フリッピング サーフェス」を参照すること。

フリッピングが終了せずに、バック バッファのブリットが既に終了している場合、トリプル バッファリングにより、アプリケーションはバック バッファにブリットし続けることができる。フリッピングの実行は同期イベントではない。つまり、あるフリッピングに他のフリッピング以上の時間をとることができる。このため、アプリケーションが 1 つのバック バッファだけを使う場合、DirectDrawSurface7.Flip メソッドが成功するまで待つ間、アイドリング時間がかかる場合がある。