MFC 雙緩衝技術

來源:互聯網
上載者:User

一、為什麼使用雙緩衝圖形重新整理技術
雙緩衝圖形重新整理技術能解決繪圖時螢幕閃爍的問題。
二、繪圖時螢幕閃爍的原因分析
很長一段時間我一直認為繪圖過程中出現的螢幕閃爍是圖形重新整理速度過快而造成的(相信有很多朋友也跟我一樣有這樣的想法),但是通過編寫一些繪圖程式,我發現事情並非如此,至少重新整理速度快不會是造成螢幕閃爍的根本原因。這個問題可以通過下面的兩個實驗進行說明。
1、編寫一個重新整理速度很慢的應用程式,可以設計為通過點擊滑鼠來進行螢幕重新整理。通過該實驗可以發現即使螢幕的重新整理速度很慢,但是在每次重新整理的時候仍然存在螢幕的問題,只是閃爍不是很明顯。
2、編寫一個重新整理速度很快的應用程式,並在程式中應用雙緩衝圖形重新整理技術。通過該實驗可以發現雖然螢幕重新整理速度很快,但是採用了雙緩衝圖新重新整理技術以後,螢幕不存在閃爍。
螢幕閃爍的根本原因是相鄰兩幀映像之間存在的巨大差異造成的,而windows gdi的圖形重新整理方式使得任何兩幀映像之間都存在著巨大的差異,因為windows gdi在進行重新整理之前都會首先將整個螢幕刷成白色,就相當於在電影膠片的相鄰兩幀之間都插入了一個白色的幀,這也就是為什麼螢幕閃爍時總是看到一個隱約的白色視窗在閃爍而不是一個紅色的視窗在閃爍。雙緩衝圖形重新整理技術避免了windows gdi重新整理的問題,其沒有在連續的兩幀之間插入白色的幀,從而解決了螢幕閃爍的問題。
三、雙緩衝圖形重新整理技術的原理
雙緩衝圖形重新整理技術顧名思義是採用雙緩衝實現的。傳統的繪圖方式實際上是一種單緩衝。在windows中每一種裝置都在記憶體中有一個裝置描述表與其對應,這個裝置描述表實際上就是一個記憶體緩衝區。傳統的繪圖中我們是將圖形繪製在裝置描述表緩衝區中,然後由gdi自動的將裝置描述表中的映像拷貝到顯存中進行顯示。這樣一個自動的拷貝過程屏蔽了傳統的繪圖方式是單緩衝的實質,使我們感覺到我們是在直接操縱顯存一樣。雙緩衝圖形重新整理技術在記憶體中有兩片緩衝,除了裝置描述表以外還有一個需要手動建立的與裝置描述表緩衝區(前端緩衝區)相相容的後備緩衝區。繪圖過程中,首先將圖形繪製在後備緩衝區中,然後在手動的將後備緩衝區中的映像拷貝到前端緩衝區中,再由gdi自動將前端緩衝區中的映像拷貝到顯存完成圖形的顯示過程。
四、雙緩衝圖形重新整理技術的實現步驟
1、建立與視窗裝置描述表(前端緩衝區)相容的記憶體裝置描述表(後端緩衝區)
2、建立與記憶體裝置描述表相相容的位元影像並將該位元影像選入記憶體裝置描述表中(沒有位元影像的裝置描述表是不能繪圖的)
3、將圖形繪製在記憶體裝置描述表中
4、將記憶體裝置描述表中的內容拷貝到視窗裝置描述表
5、釋放裝置描述表控制代碼、位元影像等資源
五、在vc 6.0中結合mfc實現雙緩衝圖形重新整理技術
1、首先在OnDraw()或者OnPaint()中添加下列代碼
void OnDraw(CDC *pDC)
{
//定義一個記憶體裝置描述表對象(即後備緩衝區)
CDC MemDC; 
//定義一個位元影像對象
CBitmap MemBitmap;
//建立與螢幕裝置描述表(前端緩衝區)相容的記憶體裝置描述表控制代碼(後備緩衝區)
MemDC.CreateCompatibleDC(NULL);
//這時還不能繪圖,因為沒有位元影像的裝置描述表是不能繪圖的
//下面建立一個與螢幕裝置描述表(或者記憶體裝置描述表)相容的位元影像
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);
//將位元影像選入到記憶體裝置描述表
//只有選入了位元影像的裝置描述表才有地方繪圖,畫到指定的位元影像上
CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);
//先用背景色將位元影像清除乾淨,這裡我用的是白色作為背景
//你也可以用自己應該用的顏色
MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255));
//繪圖
MemDC.MoveTo(……);
MemDC.LineTo(……);
//將後備緩衝區中的圖形拷貝到前端緩衝區
pDC->BitBlt(0,0,nWidth,nHeight,&MemDC,0,0,SRCCOPY);
//繪圖完成後的清理
MemBitmap.DeleteObject();
MemDC.DeleteDC();
}
2、添加WM_ERASEBKGND響應函數,並清除響應函數的產生代碼在其中添加如下代碼
BOOL OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加訊息處理常式代碼和/或調用預設值
//return CDialog::OnEraseBkgnd(pDC);
return FALSE;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.