双缓冲绘图,解决cpu使用率高问题

双缓冲技术是用来解决频繁刷新时照成的闪屏问题。但是在使用双缓冲时出现了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();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值