在 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 輸出而在於邏輯和繪圖的方法。