雙緩衝使用注意事項

       在遇到繪圖閃屏的時候,我們可能第一反應就是利用雙緩衝,這個的確是正確的。可是我們部分人會忽略某些細節造成效率降低的問題。

注意一、如果需要頻繁的向客戶區Copy像素,那麼我們的內存Dc應該是一個和窗口生命週期相同的變量。因爲,我們每次創建Dc需要消耗時間,並且在加載位圖的耗費的時間也非常多。我就犯了這個錯誤,每次繪圖重新創建一個Dc,然後加載位圖,調試的時候發現消耗時間太多了,於是得出這條結論。

注意二、在有些時候,BitBlt效率並沒有我們想象的那麼高,它可能執行一次需要零點幾毫秒。也有可能執行一次需要幾十毫秒。網上說是由於線程切換的原因,我感覺似乎不太對。

下面有段代碼:

BOOL CMerchantDlg::OnEraseBkgnd(CDC* pDC)
{
	
	CClientDC dc(this);
	int i=GetTickCount();
	//dc.BitBlt(clipRect.left,clipRect.top,clipRect.Width(),clipRect.Height(),m_dBuf,clipRect.left,clipRect.top,SRCCOPY);//copy mem dc to client dc
	//pDC->BitBlt(0,0,800,650,m_dBuf,0,0,SRCCOPY);
	dc.BitBlt(0,0,800,650,m_dBuf,0,0,SRCCOPY);
	int j=GetTickCount();
	CString str;
	str.Format(_T("%d"),j-i);
	MessageBox(str);
	return true;
//	return CDialogEx::OnEraseBkgnd(pDC);
}

m_dBuf:是我封裝的一個雙緩衝類的一個對象,內存中已經有需要繪製的數據。

但執行上面的函數時候,需要的時間 90%以上都是15ms,其他時候是0(就是說時間非常少)。

但是我用pDc的時候,90%以上是0ms.其他事15ms左右。

對於這個問題我還不知道具體原因,希望高手看到之後幫忙解答一下。謝謝

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