理解:通常我們進行繪圖時,都是直接使用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 ...