偶然间在一次中国象棋游戏编写(源代码在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));
至此,完美解决屏幕卡的问题。
游戏效果如下:
当然。这只是一个游戏的模型,功能还有待完善,但足以充分证明双缓存技术的强大,同时感谢那位大牛~~~~~~(这都能想出来,我。。。)