VC介面繪製雙快取

2021-08-19 13:11:53 字數 2867 閱讀 4660

1、閃屏的問題

在gdi的繪圖系統中,每呼叫一次區域繪圖操作,如fillrect、bitblt等,圖形顯示系統就會在螢幕中對指定的區域進行一次重新整理操作。如果頻繁的進行區域繪製操作的操作的話,我們就會發現,螢幕會出現閃屏。

使用下面的**對閃屏的問題進行測試,在xp系統閃屏尤其嚴重,在win7系統,閃屏問題有所改善。win7系統在繪製效率上有所提公升。

voidcdoublebufferview::drawdirect(cdc* pdc)

/*繪製*/

cdc dcpic;

dcpic.createcompatibledc(pdc);

cbitmap bmpimport;

bmpimport.loadbitmap(idb_bitmap1);

cbitmap* poldbmp = dcpic.selectobject(&bmpimport);

bitmap bitmap;

bmpimport.getbitmap(&bitmap);

intiwidth = bitmap.bmwidth;

intiheight = bitmap.bmheight;

pdc->bitblt(0, 0, iwidth, iheight,

&dcpic, 0, 0, srccopy);

dcpic.selectobject(poldbmp);

/*釋放資源*/

bmpimport.deleteobject();

dcpic.deletedc();

}

2、雙快取

產生閃屏的原因是類似於多程序之間的通訊問題,每次dc的繪圖操作,都要把相關的顯示資料傳送到顯示卡,顯示卡處理後,在顯示器上顯示。借鑑提公升多執行緒之間的通訊效率的解決方法,可通過減少與顯示卡之間的互動次數來提公升繪製的效率。這也就是雙快取的思路。雙快取的原理是先把更新操作中所有繪製資料先寫入記憶體,然後再呼叫bitblt或stretchblt一次性的把所有資料傳送到顯示卡中。

用乙個比喻來說,沒有用雙快取就像老師講課時在黑板上使用粉筆寫板書,學生能看到老師寫板書的整個過程,如果把黑板看做是乙個螢幕的話,老師在寫板書的過程,就是乙個閃屏的過程。

使用了雙快取,就像老師採用了多**教學,老師就可以提前在家把板書用ppt做好,上課時只要一頁一頁的翻ppt就可以了,學生們是看不到ppt製作的過程,也就會有閃屏的問題了。

可採用了如下**來實現雙快取。

voidcdoublebufferview::drawwithbufferinefficient(cdc* pdc)

3、取消擦除背景

當我們使用了上面的雙快取技術後,我們看到閃屏問題有所緩解,但是有些操作仍然會導致閃屏,比如在有滾動條的檢視視窗拖動滾動條時。為什麼會產生這樣的原因呢?先來分析一下介面的繪製原理。

當我們需要對視窗繪製時,可呼叫updatewindow、redrawwindow、invalidate或invalidaterect等函式。通過檢視這些函式的msdn中得知,有些視窗繪製函式中,有乙個是否擦除背景的選項。如果要擦除背景,那一次繪製就要進行兩部操作,也就是要跟顯示卡互動兩次,一是擦除背景,一是重新繪製圖形,那雙快取的作用就失去了。

如果我們再繪製圖形的時候,自己對背景進行一次粉刷,也就沒有必要再使用擦除背景,同時也能保證雙快取的效果。

取消擦除北京的方法主要有兩種:

(1)取消重繪時的擦除選項。

如使用invalidate(false)。

這種方法雖然有效,但是需要對所有的重繪函式進行處理,難以完全取消擦除背景。

(2)截斷擦除訊息。

背景的擦除是通過wm_erasebkgnd訊息來完成。於是,我們只要截獲了該訊息,就能徹底取消擦除背景。

可在視窗類中為wm_erasebkgnd提供訊息響應函式,然後直接返回true。

boolcdoublebufferview::onerasebkgnd(cdc* pdc)

4、繪製效率的提公升

在重新整理介面的時候,重新整理的區域越小,重新整理效率更高,因此,在重新整理介面的時候,我們應該盡量較少不必要的重新整理。作業系統也會對介面的重新整理操作進行優化,如拉動滾動條的時候,並不是對整個介面進行重新整理,而只是對已經無效的區域中換上新的圖形,然後再在螢幕調整圖形區域在介面上的位置。因此,就有乙個裁剪區域的概念,在重繪的過程中,只有裁剪區域需要重繪。因此,我們在雙快取中,也只需對裁剪區域重繪。可通過cdc::getclipbox來獲得裁剪區域的大小。

因此,對雙快取的優化**如下所示:

voidcdoublebufferview::drawwithbufferefficient(cdc* pdc)

VC介面繪製雙快取

1 閃屏的問題 在gdi的繪圖系統中,每呼叫一次區域繪圖操作,如fillrect bitblt等,圖形顯示系統就會在螢幕中對指定的區域進行一次重新整理操作。如果頻繁的進行區域繪製操作的操作的話,我們就會發現,螢幕會出現閃屏。使用下面的 對閃屏的問題進行測試,在xp系統閃屏尤其嚴重,在win7系統,閃...

VC 雙快取技術 滾動條

vc中的繪圖有個比較棘手的問題是閃爍,雙快取是解決此類問題的一種方法,但是在系統繪圖中,由於可能要載入滾動條,響應滑鼠拖動等事件,導致傳統的雙快取方法不一定適用,本文提出了一種解決方法能夠用統一的框架內實現滾動條,滑鼠圖型拖動,視口轉換以及雙快取繪圖 關鍵字 雙快取,滾動條,滑鼠拖動,vc,視口轉換...

vc雙緩衝 VC 雙緩衝實現方法

在圖形圖象處理程式設計過程中,雙緩衝是一種基本的技術。我們知道,如果窗體在響應wm paint訊息的時候要進行複雜的圖形處理,那麼窗體在重繪時由於過頻的重新整理而引起閃爍現象。解決這一問題的有效方法就是雙緩衝技術。因為窗體在重新整理時,總要有乙個擦除原來圖象的過程onerasebkgnd,它利用背景...