双缓冲使用注意事项

来源:互联网 发布:拍拍贷网络借贷 编辑:程序博客网 时间:2024/06/09 13:51

       在遇到绘图闪屏的时候,我们可能第一反应就是利用双缓冲,这个的确是正确的。可是我们部分人会忽略某些细节造成效率降低的问题。

注意一、如果需要频繁的向客户区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左右。

对于这个问题我还不知道具体原因,希望高手看到之后帮忙解答一下。谢谢

原创粉丝点击