偶然間在一次中國象棋遊戲編寫(源代碼在http://download.csdn.net/detail/fawdlstty/5766599下載)中,使用到了一個技術:雙緩存技術,我覺得有必要說明一下。
雙緩存技術主要解決閃屏問題而出現,但我最近請教一位大神時才知道(汗。。。)。
在我這次遊戲編寫中,出現了一個BUG,就是屏幕不停的閃(我使用SetTimer定時調用InvalidateRect刷新窗口,每次Paint時首先畫棋盤,然後畫棋子,需要的時間很長,所以看起來很卡),爲了解決這個問題,那位大神給我說了一個方法,就是使用雙緩存技術來實現。代碼如下:
BOOL han_Gdi_OnPaint()
{
PAINTSTRUCT ps;
HDC hDC = BeginPaint(::hWnd2, &ps);
Graphics g(hDC);
//畫圖
g.DrawImage(::img_Main, Rect(::rectPaint.left, ::rectPaint.top, ::rectPaint.right, ::rectPaint.bottom));
for(int iLine=0; iLine<10; iLine++)
for(int iRow=0; iRow<9; iRow++)
if(0xFF != ::chessPtr[iLine][iRow])
{
//畫選擇項
if(::ptSelect.x == iLine && ::ptSelect.y == iRow && TRUE != ::bShowSelect)
continue;
g.DrawImage(::img_Point[hanDef_PtrIsRed(::chessPtr[iLine][iRow])][hanDef_PtrIndex(::chessPtr[iLine][iRow])],
Rect(iRow*77*iCalc/1000+iCalc/50, iLine*77*iCalc/1000+iCalc/40, iCalc/13, iCalc/13));
}
EndPaint(::hWnd2, &ps);
return TRUE;
}
這個是未使用雙緩存技術的代碼,閃的原因一清二楚了,就是畫棋子所需要的時間過長,導致延遲很高。爲了解決這個問題,於是我使用雙緩存技術(源代碼在Gdiplus_Show.cpp中可以找到):
BOOL han_Gdi_OnPaint()
{
PAINTSTRUCT ps;
HDC hDC = BeginPaint(::hWnd2, &ps);
Graphics g((Image *)::bmpDraw);
//畫圖
g.DrawImage(::img_Main, Rect(::rectPaint.left, ::rectPaint.top, ::rectPaint.right, ::rectPaint.bottom));
for(int iLine=0; iLine<10; iLine++)
for(int iRow=0; iRow<9; iRow++)
if(0xFF != ::chessPtr[iLine][iRow])
{
//畫選擇項
if(::ptSelect.x == iLine && ::ptSelect.y == iRow && TRUE != ::bShowSelect)
continue;
g.DrawImage(::img_Point[hanDef_PtrIsRed(::chessPtr[iLine][iRow])][hanDef_PtrIndex(::chessPtr[iLine][iRow])],
Rect(iRow*77*iCalc/1000+iCalc/50, iLine*77*iCalc/1000+iCalc/40, iCalc/13, iCalc/13));
}
Graphics gDraw(hDC);
gDraw.DrawImage((Image *)::bmpDraw, Point(0, 0));
EndPaint(::hWnd2, &ps);
return TRUE;
}
首先,創建一塊內存畫布:Graphics g((Image *)::bmpDraw);
然後畫棋子時就在畫布上畫了,。。
在最後,將畫布上的內容複製到屏幕上:gDraw.DrawImage((Image *)::bmpDraw, Point(0, 0));
至此,完美解決屏幕卡的問題。
遊戲效果如下:
當然。這只是一個遊戲的模型,功能還有待完善,但足以充分證明雙緩存技術的強大,同時感謝那位大牛~~~~~~(這都能想出來,我。。。)