雙緩存技術

偶然間在一次中國象棋遊戲編寫(源代碼在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));

至此,完美解決屏幕卡的問題。

遊戲效果如下:


當然。這只是一個遊戲的模型,功能還有待完善,但足以充分證明雙緩存技術的強大,同時感謝那位大牛~~~~~~(這都能想出來,我。。。)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章