在 GDI 中利用双缓冲技术我们通过在内存中操作的速度远远大于在屏幕上画图的速度的特点解决了刷新屏幕的时候屏幕闪烁的现象。的确如此,在下面的代码我们可以看到 :
LRESULT CVeiwManage ::ReDraw (HDC hdc ,int x ,int y )
{
HBITMAP m_backbitmap =NULL ;
Create (m_backbitmap ,hdc ,m_myRect .right -m_myRect .left ,m_myRect .bottom -m_myRect .top ,m_bkColor );
HDC mdc =CreateCompatibleDC (hdc );
SelectObject (mdc ,m_backbitmap );
OnPreDraw (mdc );
OnDraw (mdc );
OnDrawEnd (mdc );
if (bTrans )
{
TransparentBlt (hdc ,m_myRect .left ,m_myRect .top ,m_myRect .right -m_myRect .left , m_myRect .bottom -m_myRect .top ,mdc ,0,0,m_myRect .right -m_myRect .left ,m_myRect .bottom -m_myRect .top ,crTransColor );
}
else
{
BitBlt (hdc ,m_myRect .left ,m_myRect .top ,m_myRect .right -m_myRect .left ,
m_myRect .bottom -m_myRect .top ,mdc ,0,0,SRCCOPY );
}
DeleteObject (m_backbitmap );
DeleteDC (mdc );
return 0;
}
我们利用了双缓冲技术在一个内存DC 上绘制图片,然后在将内存DC 拷贝到屏幕DC 上。在主窗口中,我们采用帧频为25HZ 的速度刷新屏幕,但是一个新的问题出现了,如果存在很多的GDI 对象,在绘制的过程中CPU 占用达到了30% 以上。如何才能在优化界面的基础上减少CPU 的占用率?我觉得速度瓶颈不在于GDI 输出而在于逻辑和绘图的方法。