雙緩衝技術

2021-08-03 04:55:18 字數 1697 閱讀 5001

理解:通常我們進行繪圖時,都是直接使用cdc(cpaintdc等)物件在螢幕上繪製圖形,如我們經常在onpaint函式中使用:

cpaintdc dc(this);

dc.rectangle(0,0,100,100);

在螢幕上繪製矩形。

但如果應用需要頻繁的繪製圖形,比如每秒要在螢幕上繪製1000個矩形。因此每繪製乙個矩形到螢幕上顯示,由於螢幕頻繁的更新操作會導致閃爍現象。如何解決呢?使用雙緩衝技術吧!

雙緩衝技術的原理很簡單,它通過建立乙個基於記憶體cdc物件,該物件不會將影象直接顯示在螢幕上。然後所有的繪圖操作都由該物件來進行繪製(如1000個矩形)。最後將該物件繪製的影象拷貝到用於顯示cdc物件上,進行螢幕顯示。雙緩衝技術相對於將影象的繪製和顯示分離了。

實驗原始碼:(使用基於單文件的工程)

為cbbview類新增變數:

[cpp]view plain

copy

print?

cdc* m_pmemdc;  

cbitmap* m_pbitmap;  

cdc* m_pmemdc;

cbitmap* m_pbitmap;

初始化:

[cpp]view plain

copy

print?

cbbview::cbbview()  

cbbview::~cbbview()    

cbbview::cbbview()

cbbview::~cbbview()

建立:

[cpp]view plain

copy

print?

int cbbview::oncreate(lpcreatestruct lpcreatestruct)    

int cbbview::oncreate(lpcreatestruct lpcreatestruct)

拷貝影象用於顯示,在ondraw函式中新增**:

[cpp]view plain

copy

print?

crect rect;  

getclientrect(&rect);  

pdc->bitblt(0, 0, rect.width(), rect.height(), m_pmemdc, 0, 0, srccopy);  

crect rect;

getclientrect(&rect);

pdc->bitblt(0, 0, rect.width(), rect.height(), m_pmemdc, 0, 0, srccopy);

響應單擊事件,進行繪圖:

[cpp]view plain

copy

print?

void cbbview::onlbuttondown(uint nflags, cpoint point)    

void cbbview::onlbuttondown(uint nflags, cpoint point)

無論單擊多快·,都不會閃爍。

2013 4 15 雙緩衝技術

主要原理 當乙個動畫爭先顯示時,程式有在改變他,前面還沒有顯示完,程式又請求重新繪製,這樣螢幕就會不停的閃爍。為了避免閃爍,可以用雙緩衝技術,將要哦處理的都在記憶體中處理好之後,再將其顯示到螢幕上。這樣顯示出來的總是完整的影象,不會出現閃爍的現象。核心技術 先通過setbitmap方法將要繪製哦所有...

Android 雙緩衝技術

有時候當我們的資料量過度的時候,這個時候如果我們頻繁的呼叫ondraw 方法就會導致畫面卡頓現象,閃屏現象,為了防止這種事情的發生,我們可以使用雙緩衝來載入資源顯示。雙緩衝技術例項 author b publicclasssu ceviewextendsviewimplementsrunnable ...

Android 雙緩衝技術

有時候當我們的資料量過度的時候,這個時候如果我們頻繁的呼叫ondraw 方法就會導致畫面卡頓現象,閃屏現象,為了防止這種事情的發生,我們可以使用雙緩衝來載入資源顯示。雙緩衝技術例項 author b publicclasssu ceviewextendsviewimplementsrunnable ...