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