在遇到繪圖閃屏的時候,我們可能第一反應就是利用雙緩衝,這個的確是正確的。可是我們部分人會忽略某些細節造成效率降低的問題。
注意一、如果需要頻繁的向客戶區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左右。
對於這個問題我還不知道具體原因,希望高手看到之後幫忙解答一下。謝謝