第十九篇:提高SOUI應用程序渲染性能的三種武器


SOUI是一套100%開源的基於DirectUI的客戶端開發框架。

基於DirectUI設計的UI雖然UI呈現的效果可以很炫,但是相對於傳統的win32應用程序中每個控件一個窗口句柄的形式,渲染效率是一個很重要的問題。

在SOUI系統中提供了三種武器可以用來提高渲染效率:

第一種武器:選擇更高效的渲染引擎

渲染引擎提供文字,幾何圖形,圖像的在緩存上的繪制功能。在SOUI系統中,渲染引擎是一個獨立的模塊,它不依賴於SOUI系統中的其它模塊。

在SOUI系統中已經內置了基於skia及GDI兩種框架的渲染模塊(skia即在google的chrome及android中使用的渲染引擎)。直觀的比較采用兩種不同渲染引擎demo中動畫的流暢度就可以知道基於skia的渲染引擎速度要比基於GDI的快不少。(GDI慢的原因可能是因為在GDI原生不支持alpha通道,而在實現的過程中采用alphablend模擬alpha時導致性能損失)

如果用戶覺得內置的渲染引擎還是不足以滿足自己的需求,還可以選擇自己實現新的渲染引擎,如基於Direct2D, cairo, agg等渲染引擎。

第二種武器:繪制緩存

一個窗口中的呈現的內容很多時候都是固定的,特別是當窗口大小不變的時候。窗口中呈現的內容可能是經過復雜計算獲得的(如圖像的九宮格切分,拉伸等),如果每次刷新都重新計算顯示渲染效率可能下降,特別是當窗口還比較大的時候。

為了解決這個問題,在SOUI系統中,我們為SWindow提供了一個cache屬性,cache=“1”時,在窗口中繪制的內容會被自動緩存,下次刷新時,自動從緩存中提取數據,從而大大加速繪制過程。

第三種武器:非背景混合技術

DirectUI炫酷的效果是依賴於各窗口之間的相互混合實現的(alphablend),但是有些時候一個窗口它可能有自己固定的背景,或者前景完全覆蓋窗口而不需要背景。如果這個窗口刷新非常頻繁,那么每次刷新都先通知各級父窗口刷新獲得背景再做混合將是很大的性能損失(如視頻播放窗口)。

為了解決這個問題,在SOUI系統中(ver:1.3.0.1)為SWindow實現了一個新的屬性:bkgndBlend,該屬性默認為“1”,代表刷新時使用背景混合。如果該屬性為“0”,則該窗口刷新的時候直接刷新自己,而不請求父窗口刷新背景,最終提高UI的渲染效率。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM