c++雙緩沖技術,以避免閃爍繪圖


當數據量非常大時,畫圖可能須要幾秒鍾甚至更長的時間,並且有時還會出現閃爍現象,為了解決這些問題。可採用雙緩沖技術來畫圖。

雙緩沖即在內存中創建一個與 屏幕畫圖區域一致的對象,先將圖形繪制到內存中的這個對象上,再一次性將這個對象上的圖形復制到屏幕上,這樣能大大加快畫圖的速度。雙緩沖實現步驟例如以下:
1、在內存中創建與畫布一致的緩沖區
2、在緩沖區繪圖
3、將緩沖區位圖復制到當前畫布上
4、釋放內存緩沖區
圖形圖象處理編程過程中,雙緩沖是一種主要的技術。我們知道,假設窗口在響應WM_PAINT消息的時候要進行復雜的圖形處理,那么窗口在重繪時由於過頻的刷新而引起閃爍現象。

解決這一問題的有效方法就是雙緩沖技術。由於窗口在刷新時,總要有一個擦除原來圖象的過程OnEraseBkgnd,它利用背景色填充窗口畫圖區,然后在調用新的畫圖代碼進行重繪,這樣一擦一寫造成了圖象顏色的反差。

當WM_PAINT的響應非常頻繁的時候。這樣的反差也就越發明顯。於是我們就看到了閃爍現象。 

我們會非常自然的想到,避免背景色的填充是最直接的辦法。

可是那樣的話,窗口上會變的一團糟。由於每次繪制圖象的時候都沒有將原來的圖象清除,造 成了圖象的殘留。於是窗口重繪時,畫面往往會變的亂七八糟。所以單純的禁止背景重繪是不夠的。

我們還要進行又一次畫圖,但要求速度非常快,於是我們想到了使用 BitBlt函數。它能夠支持圖形塊的復制。速度非常快。我們能夠先在內存中作圖。然后用此函數將做好的圖拷貝到前台,同一時候禁止背景刷新。這樣就消除了閃 爍。以上也就是雙緩沖畫圖的主要的思路。

 

首先給出實現的程序,然后再解釋,相同是在OnDraw(CDC *pDC)中: 
CDC MemDC; //首先定義一個顯示設備對象 
CBitmap MemBitmap;//定義一個位圖對象 //隨后建立與屏幕顯示兼容的內存顯示設備
MemDC.CreateCompatibleDC(NULL); //這時還不能畫圖,由於沒有地方畫 ^_^ 
//以下建立一個與屏幕顯示兼容的 位圖,至於位圖的大小嘛。能夠用窗體的大小。也能夠自定義
(如:有滾動欄時就要大於當前窗體的大小,在BitBlt時決定拷貝內存的哪部分到屏幕上)
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); //畫圖完畢后的清理 //把前面的pOldBit選回來.在刪除MemBitmap之前要先從設備中移除它 
MemDC.SelectObject(pOldBit); MemBitmap.DeleteObject(); MemDC.DeleteDC();  雙緩沖孔(two way soft-closing)

版權聲明:本文博客原創文章,博客,未經同意,不得轉載。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM