C++のダブルバッファ機構

1198 ワード

私たちが直接デバイス上で図を描くと、プログラムは自動的に作成した画像を表示デバイスにコピーして表示し、背景色が前の景色と大きく異なる場合、実際の状況はインタフェースの頻繁なフラッシュのように見えます.デュアルバッファメカニズムは、デバイスのメモリコピーを作成することです.メモリに図面を作成し、完了したら実際のデバイスに全体的にコピーして貼り付け、全体的なコピーを貼り付けることで、点滅を避けることができます.
次はメモリデバイスの作成です.

CDC memCdc;//    
CBitmap memBmp;//            ,     SelectObject
memCdc.CreateCompatibleDC(&dc);//dc     
memBmp.CreateCompatibleBitmap(&dc, screenWidth, screenHeight);
memCdc.SelectObject(&memBmp);

その後memCdc上で図を描くことができます.その後、以下のコードで完全な画像を実際のデバイスdcにコピーする.

dc.BitBlt(0, 0, screenWidth, screenHeight, &memCdc, 0, 0, SRCCOPY);
memCdc.DeleteDC();
memBmp.DeleteObject();

私たちが自分で画像の後ろの背景を描くように要求し、同時に背景の内容を少量変更することができる場合、メモリ画像で私たちの背景を記憶し、このbmp画像(すなわち、上のmemBmp、これはmemBmpがローカル変数ではないことを要求する)を解放せず、背景の内容を再描画するたびに、bmp画像BitBltを直接コピーすればよい.もちろん、ここでは最後のbmpのリリースに注意します(または、バックグラウンドを更新する場合は、再リリースしてからCreateCompatibleBitmap割り当てを行う必要があります).

if(Cbmp.GetSafeHandle() != NULL)
   Cbmp.DeleteObject();

したがって、デュアルバッファのメモリ作図は、点滅の問題を解決するだけでなく、静的背景の再描画回数を減らし、インタフェースのリフレッシュ遅延を回避することができます.