BitBlt雙緩沖解決圖象閃爍(精)_第1頁
BitBlt雙緩沖解決圖象閃爍(精)_第2頁
免費預(yù)覽已結(jié)束,剩余3頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、BitBlt(雙緩沖解決圖象閃爍顯示圖形如何避免閃爍,如何提高顯示效率是問得比較多的問題。而且多數(shù)人 認(rèn)為MFC 的繪圖函數(shù)效率很低,總是想尋求其它的解決方案。MFC 的繪圖效率的確不高但也不差,而且它的繪圖函數(shù)使用非常簡單,只要使 用方法得當(dāng),再加上一些技巧,用 MFC 可以得到效率很高的繪圖程序。我想就我長期(呵呵當(dāng)然也只有 2 年多使用 MFC 繪圖的經(jīng)驗談?wù)勎业囊恍┯^ 點。1、顯示的圖形為什么會閃爍?我們的繪圖過程大多放在 On Draw或者 On Pai nt函數(shù)中,OnDraw在進(jìn)行屏幕顯 示時是由 On Pai nt 進(jìn)行調(diào)用的。當(dāng)窗口由于任何原因需要重繪時,總是先用背景色 將顯

2、示區(qū)清除,然后才調(diào)用 On Pai nt,而背景色往往與繪圖內(nèi)容反差很大,這樣在短時 間內(nèi)背景色與顯示圖形 的交替出現(xiàn),使得顯示窗口看起來在閃。如果將背景刷設(shè)置成 NULL,這樣無論怎樣重繪圖 形都不會閃了。當(dāng)然,這樣做會使得窗口的顯示亂 成一團(tuán),因為重繪時沒有背景色對原來繪 制的圖形進(jìn)行清除,而又疊加上了新的圖 形。有的人會說,閃爍是因為繪圖的速度太慢或者 顯示的圖形太復(fù)雜造成的,其實 這樣說并不對,繪圖的顯示速度對閃爍的影響不是根本性的。例如在 OnDraw(CDC*pDC 中這樣寫:pDC-MoveTo(0,0;pDC-Li neTo(100,100;這個繪圖過程應(yīng)該是非常簡單、非常快了

3、吧,但是拉動窗口變化時還是會看見閃爍。其實從道理上講,畫圖的過程越復(fù)雜越慢閃爍應(yīng)該越少,因為繪圖用的時間 與用背景清除屏幕所花 的時間的比例越大人對閃爍的感覺會越不明顯。比如:清楚屏幕時間為 1s 繪圖時間也是為 1s 這樣在 10s 內(nèi)的連續(xù)重畫中就要閃爍 5 次;如果清楚屏幕時間為 1s 不變,而繪圖時間 為 9s,這樣 10s 內(nèi)的連續(xù)重畫只會閃爍一次。這個也可以試驗,在 OnDraw(CDC *pDC 中 這樣寫:for(int i=0;iMoveTo(0,i;pDC-Li neTo(1000,i;呵呵,程序有點變態(tài),但是能說明問題。說到這里可能又有人要說了,為什么一個簡單圖形看起來沒

4、有復(fù)雜圖形那么閃 呢?這是因為復(fù)雜圖形占的面積大,重畫時造成的反差比較大,所以感覺上要閃得厲 害一些,但是閃爍頻率要低。那為什么動畫的重畫頻率高,而看起來卻不閃?這里,我就要再次強(qiáng)調(diào)了,閃爍是什么?閃爍就是反差,反差越大,閃爍越厲害。因為動畫 的連續(xù)兩個幀之間的差異很小 所以看起來不閃。如果不信,可以在動畫的每一幀中 間加一張純白的幀,不閃才怪呢。2、如何避免閃爍在知道圖形顯示閃爍的原因之后,對癥下藥就好辦了。首先當(dāng)然是去掉MFC 提供的背景繪制過程了。實現(xiàn)的方法很多,*可以在窗口形成時給窗口的注冊類的背景刷付NULL*也可以在形成以后修改背景static CBrush brush(RGB(2

5、55,0,0;SetClassLo ng(this-m_hWnd,GCL_HBRBACKGROUND,(LONG(HBRUSHbrush;要簡單也可以重載 OnErASEBkgnd(CDC* pDC 直接返回 TRUE這樣背景沒有了,結(jié)果圖形顯示的確不閃了,但是顯示也象前面所說的一樣,變得一團(tuán)舌 L。怎么辦?這就要用到雙緩存的方法了。雙緩沖就是除了在屏幕上有圖形進(jìn) 行顯示以外,在內(nèi)存中也有圖形在繪制。我們可以把要顯示的圖形先在內(nèi)存中繪制好,然后再一次性的將 內(nèi)存中的圖形按照一個點一個點地覆蓋到屏幕上去(這個過程非常快,因為是非常規(guī)整的內(nèi) 存拷貝。這樣在內(nèi)存中繪圖時,隨便用什么反差大 的背景色進(jìn)

6、行清除都不會閃,因為看不 見。當(dāng)貼到屏幕上時,因為內(nèi)存中最終的圖 形與屏幕顯示圖形差別很小(如果沒有運動,當(dāng)然就沒有差別,這樣看起來就不會 閃。3、如何實現(xiàn)雙緩沖首先給出實現(xiàn)的程序,然后再解釋,同樣是在 OnDraw(CDC *pDC 中:CDC MemDC; /首先定義一個顯示設(shè)備對象CBitmap MemBITmap;/定義一個位圖對象/隨后建立與屏幕顯示兼容的內(nèi)存顯示設(shè)備MemDC.CreateCompatibleDC(NULL;這時還不能繪圖,因為沒有地方畫A_A下面建立一個與屏幕顯示兼容的位圖,至于位圖的大小嘛,可以用窗口的大小MemBitmap.CreateCompatibleBI

7、Tm ap(pDC, nWidth, nH eight;/將位圖選入到內(nèi)存顯示設(shè)備中/只有選入了位圖的內(nèi)存顯示設(shè)備才有地方繪圖,畫到指定的位圖上CBitmap *pOldBit=MemDC.SelectObject(&MemBITmap;先用背景色將位圖清除干凈,這里我用的是白色作為背景/你也可以用自己應(yīng)該用的顏色MemDC.FillSolidRect(0,0, nWidth, nH eight,RGB(255,255,255;繪圖MemDC.MoveTo( ;MemDC.LineTo(.;/將內(nèi)存中的圖拷貝到屏幕上進(jìn)行顯示pDC-BITBIt(0,0, nWidth ,nH eigh

8、t,&MemDC,0,0,SRCCOPY;繪圖完成后的清理MemBIT map .DeleteObject(;MemDC.DeleteDC(;上面的注釋應(yīng)該很詳盡了,廢話就不多說了。4、如何提高繪圖的效率我主要做的是電力系統(tǒng)的網(wǎng)絡(luò)圖形的 CAD 軟件,在一個窗口中往往要顯示成千 上萬個電力元件,而每個元件又是由點、線、圓等基本圖形構(gòu)成。如果真要在一 次重繪過程重畫這 么多元件,可想而知這個過程是非常漫長的。如果加上了圖形的瀏覽功能,鼠標(biāo)拖動圖形滾動時需要進(jìn)行大量的重繪,速度會慢得讓用戶將無法忍 受。怎么辦?只有再研究研究 MFC 的繪圖過程了。實際上,在 OnDraw(CDC *pDC

9、 中繪制的圖并不是所有都顯示了的,例如:你在OnDraw 中畫了兩個矩形,在一次重繪中雖然兩個矩形的繪制函數(shù)都有執(zhí)行,但是很 有可能只有一個 顯示了,這是因為 MFC 本身為了提高重繪的效率設(shè)置了裁剪區(qū)。裁剪區(qū)的作用就是:只有在這個區(qū)內(nèi)的繪圖過程才會真正有效,在區(qū)外的是無效的,即使在區(qū)外執(zhí)行了繪圖函數(shù)也是 不會顯示的。因為多數(shù)情況下窗口重繪的產(chǎn)生大 多是因為窗口部分被遮擋或者窗口有滾動發(fā)生,改變的區(qū)域并不是整個圖形而只有一小部分,這一部分需要改變的就是 pDC 中的裁剪 區(qū)了。因為顯示(往內(nèi)存或者顯 存都叫顯示 比繪圖過程的計算要費時得多,有了裁剪區(qū)后 顯示的就只是應(yīng)該顯示的 部分,大大提高了顯示效率。但是這個裁剪區(qū)是 MFC 設(shè)置的,它已經(jīng)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論