基于NET的雙緩沖技術(shù)論文
通常在圖形應(yīng)用程序開發(fā)過程中,經(jīng)常會遇到圖形顯示時屏幕不停閃爍的現(xiàn)象。畫面要產(chǎn)生動態(tài)效果,編程時要在視圖中進(jìn)行貼圖,并不斷刷新重繪,但是刷新頻率過高,就會出現(xiàn)閃屏的現(xiàn)象。又或者是實時數(shù)據(jù)顯示,數(shù)據(jù)不斷更新,數(shù)據(jù)所在的控件也需要不斷地刷新,這樣也會出現(xiàn)閃屏的現(xiàn)象。因此,閃屏這個問題嚴(yán)重地影響了用戶的體驗。
針對這個問題有一些解決辦法:刷新特定的矩形區(qū)域、頁面切換、雙緩沖等。但在一般情況下,開發(fā)人員會選擇雙緩沖技術(shù),因為適用范圍廣泛,不過需要較多的內(nèi)存。
1 閃屏
閃屏現(xiàn)象出現(xiàn)的可能原因:為了維持窗口的正常顯示,每次都需要調(diào)用Paint事件進(jìn)行重繪操作刷新畫面。雖然窗口在刷新過程中會使所有圖元重繪,不過圖元的重繪并不引發(fā)Paint事件,因此窗口刷新時只會調(diào)用一次Paint事件。在窗口刷新過程中,重繪的圖元都會馬上顯示到窗口,只要有圖元的位置,就會有圖元的更替刷新,當(dāng)圖元較多數(shù)量時,圖元更替刷新的時間存在肉眼可辨的時差時,就會導(dǎo)致閃爍現(xiàn)象出現(xiàn);當(dāng)圖元數(shù)量較少時,窗體重圖元更替刷新的位置也不多,窗口閃爍現(xiàn)象并不會很嚴(yán)重;隨著圖元數(shù)量的增加,繪圖窗口每次刷新引起的圖元重繪數(shù)量也會增加,窗口刷新的位置分布就更加廣泛,閃爍現(xiàn)象就會越來越嚴(yán)重。又或者是因為窗口刷新時間間隔小于圖元顯示到窗口所耗費的時間,因此在對圖元進(jìn)行鼠標(biāo)跟蹤繪制操作,抑或是對圖元進(jìn)行變形操作,由于調(diào)用Paint事件次數(shù)大量增加,窗口刷新次數(shù)也同時增加,即使窗口刷新時所有圖元的更替刷新沒有時間差異,也會因為延時關(guān)系導(dǎo)致閃爍現(xiàn)象。
2 雙緩沖技術(shù)
2.1 基本思想
Windows的重繪窗體操作一般分為3個階段:
第一階段,背景清除,通過Windows的操作系統(tǒng)級背景刷清除重繪窗體上的無效區(qū)域。
第二階段,背景繪制,通過窗體的受保護方法OnPaint-Background完成窗體背景繪制,當(dāng)然也可以通過重寫該方法進(jìn)行自定義窗體背景的操作。
第三階段,圖形繪制,通過窗體的受保護方法OnPaint完成圖形繪制,然后引發(fā)Paint事件。3個階段的操作全完成后,Windows窗體的繪圖才算真正完成。而雙緩沖技術(shù)就是將窗體重繪過程的3個階段合為一次操作,從而實現(xiàn)圖形閃爍現(xiàn)象的消除。具體實現(xiàn)方法是先在一塊內(nèi)存(后端緩沖區(qū))中完成重繪窗體的3個階段,然后再將繪制好的圖形從內(nèi)存中拷貝到顯存中,如圖1所示,由于在屏幕上只執(zhí)行了一次顯示圖形的操作,因此用戶觀察不到窗體重繪的中間畫面,從而消除了圖形的閃爍。
2.2 實現(xiàn)方法
2.2.1 利用默認(rèn)雙緩沖
利用默認(rèn)雙緩沖的方法有兩種,第一種也就是最簡單的便是將.NetFramework中的Double Buffered屬性設(shè)置為true:this.DoubleBuffeed=true;
第二種方法便是通過SetStyle為Windows窗體和Windows控件啟用默認(rèn)的雙緩沖。在.Net框架2.0以上版本中設(shè)置參數(shù)屬性如下: Double Buffer和Double Buffer參數(shù)設(shè)為true;而UserPaint設(shè)為true表示控件自行負(fù)責(zé);All Painting lnWmPaint設(shè)為true表示禁止擦除背景。
2.2.2 自定義雙緩沖
.netframework中的類Buffered Graphics Context獨立管理和分配圖形緩沖區(qū)。應(yīng)用程序域都通過其默認(rèn)Buffered Graphics Context實例實現(xiàn)應(yīng)用程序默認(rèn)雙緩沖的管理。一般情況下,應(yīng)用程序的應(yīng)用域存在唯一性,因而每個應(yīng)用程序通常都只有一個默認(rèn)的'由Buffered Graphics Manager類管理Buffered=Graphics Context實例。管理Buffered Graphics Context實現(xiàn)雙緩沖的具體步驟如下:引用Buffered Graphics Context類的實例。通過調(diào)用Buffered Graphics Context.Allocate方法創(chuàng)建Buffered Graphics類的實例。通過設(shè)置Buffered Graphics.屬性將圖形繪制到緩沖區(qū)。
在緩沖區(qū)中完成所有的圖形繪制操作后,再將緩沖區(qū)的圖形內(nèi)容通過Buffered Graphics.Render方法復(fù)制到與該緩沖區(qū)關(guān)聯(lián)的繪圖圖面或者指定的繪圖圖面。完成呈現(xiàn)圖形之后,對Buffered Graphics實例調(diào)用Dispose方法完成系統(tǒng)資源的釋放。
2.2.3 編程實例
無錫地鐵一號線的遠(yuǎn)程故障傳輸?shù)孛孳浖残枰渲械膱D形閃爍現(xiàn)象。以無錫地鐵一號線的遠(yuǎn)程故障傳輸?shù)孛孳浖䴙槔樱v述怎樣使用.NET框架內(nèi)置雙緩沖技術(shù)消除圖形閃爍。
無錫地鐵一號線的遠(yuǎn)程故障傳輸?shù)孛孳浖菍RM模塊的故障數(shù)據(jù)通過無線傳輸傳到地面軟件,然后通過地面軟件將故障數(shù)據(jù)顯示出來。ERM模塊將數(shù)據(jù)打包發(fā)給車載PIS,然后車載PIS發(fā)給中間服務(wù)器,中間服務(wù)器再轉(zhuǎn)發(fā)給地面軟件。地面軟件接收的是實時數(shù)據(jù),每隔50ms接收的數(shù)據(jù)就填充顯示一次,界面顯示的內(nèi)容需要不斷刷新,刷新次數(shù)過于頻繁,就會出現(xiàn)閃屏的現(xiàn)象。
為解決這個問題,此軟件使用了雙緩沖技術(shù)中的默認(rèn)緩沖。數(shù)據(jù)是在ListView、ListBox兩個控件上顯示,通過Set-Style為ListView、ListBox啟用默認(rèn)緩沖。
沒有使用雙緩沖時,在屏幕上直接繪制ListBox與ListView,然后填充數(shù)據(jù),就會看見屏幕上的數(shù)據(jù)不停地閃爍;而雙緩沖技術(shù)的繪圖,先在內(nèi)存上創(chuàng)建的“虛擬屏幕”上繪圖、填充數(shù)據(jù),然后將繪好了的圖形一次性“拷貝”到屏幕上。
其實也可以使用自定義雙緩沖來實現(xiàn),其效果與默認(rèn)雙緩沖一樣。默認(rèn)雙緩沖的使用比較簡便,自定義的卻繁瑣一些,但是更具靈活性,然而默認(rèn)雙緩沖是在每次繪圖時建立新緩沖區(qū),使用完便馬上釋放。當(dāng)應(yīng)用中繪圖操作密集時,這種頻繁地分配、釋放內(nèi)存,將會嚴(yán)重影響程序的性能。
3 結(jié)語
消除閃屏的常用編程技術(shù)便是雙緩沖技術(shù)。具體應(yīng)用中需要根據(jù)應(yīng)用的簡單難易程度進(jìn)行選擇采用默認(rèn)雙緩沖還是自定義雙緩沖,對于繪圖操作較少的簡單應(yīng)用程序,一般采用啟動默認(rèn)雙緩沖;而對于那種繪圖操作密集的應(yīng)用程序,例如:動畫、游戲等,應(yīng)該優(yōu)先選擇自定義雙緩沖,可以控制雙緩沖的中間過程,來提高程序性能。
【基于NET的雙緩沖技術(shù)論文】相關(guān)文章:
.NET實習(xí)總結(jié)12-26
基于核心素養(yǎng)的英語寫作教學(xué)策略論文09-29
基于英漢對比的大學(xué)英語寫作教學(xué)方案研究論文12-12
net economy的英語四級作文06-22
科技ASP.NET面試題06-20
ASP.NET面試試題集錦06-20
必備.net面試題及答案06-19
常見.net面試題及答案06-19
ASP.NET專業(yè)面試試題06-16