双缓冲技术是用来解决频繁刷新时照成的闪屏问题。但是在使用双缓冲时出现了cpu使用率非常高,有时甚至是100%。经过调试发现原来是每次画图,我都CreateCompatibleBitmap,其实将CreateCompatibleBitmap放在初始化就好了,不要每次刷新时都去创建一次。以下是双缓冲的概念及步骤,摘自百度百科。
双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度。双缓冲实现过程如下:
1、在内存中创建与画布一致的缓冲区
2、在缓冲区画图
3、将缓冲区位图拷贝到当前画布上
4、释放内存缓冲区
双缓冲使用例子,创建的是MFC单文档视图工程:
CTstView类增加三个成员:
CDC MemDc; /**缓冲dc,作为类的成员变量 */
CBitmap Bmp; /** 缓冲位图,作为类的成员变量*/
BOOL m_bFisrtDraw; /** 首次调用画图函数 */
初始化函数OnInitialUpdate():
m_bFisrtDraw=TRUE; /** 首次调用画图函数 */
画图函数:
Void CTstView::TestDraw(CDC *pDC)
{
if(m_bFisrtDraw) /** 第一次使用时初始化,如果去掉这个,cpu使用率将非常高 */
{
m_bFisrtDraw=FASLE;
/** 创建一个dc */
MemDc.CreateCompatibleDC(NULL);
/** 创建一个与画布兼容的位图,pDC为画布dc,iwith位图宽,iheight位图高 */
Bmp.CreateCompatibleBitmap(pDC,iwith,height);
/** 将位图选入缓冲dc */
MemDc.SelectObject(&Bmp);
}
/** 在缓冲dc上画图后 */
MemDc.MoveTo(50,50);
MemDc.LineTo(200,200);
/** 拷贝到当前画布上 */
pDC->BitBlt(ix,iy,iwidth,iheight,&MemDc,0,0,SRCCOPY);
}
反初始化时释放资源,可在OnDestroy()里面释放:
if(m_bFisrtDraw)
{
MemDc.DeleteDC();
Bmp.DeleteObject();
}