每過幾年,就會有傳聞說某個博物館在用x光掃瞄一副無價的名畫之後,發現畫作的作者其實重用了老的畫布,在名畫的底下還藏著另一副沒有被發現的畫作。有時候,博物館還能用高階的影象技術來還原畫布上的原作。android裡面的view的繪製就是類似的情況。當android系統繪製螢幕的時候,先畫父view,然後子view,再是更深的子view等等。這會導致所有的view都被繪製到了螢幕上,就像畫家的畫布一樣,這些view都被他們的子view覆蓋住了。
簡單來說,過度繪製就是螢幕上的某個畫素點在同一幀的時間內繪製了多次。
當設計上追求更華麗的視覺效果的時候,我們就容易陷入採用越來越多的層疊元件來實現這種視覺效果的怪圈。這很容易導致大量的效能問題,為了獲得最佳的效能,我們必須儘量減少 overdraw 的情況發生。
當我們來繪製乙個介面時,會有乙個 windows,然後是建立 activity,在 activity 裡可以建立多個 view,或 view group,view 也可以巢狀 view。這些元件從上到下分布,上面的元件是可以被使用者看見的,而在下面的元件是不可見的,但是我們依然要花很多時間去繪製那些不可見的元件,因為在某些時候,它也可能會顯示出來。
按照以下步驟開啟 show gpu overrdraw 的選項:設定 -> 開發者選項 -> 除錯gpu過度繪製 -> 顯示gpu過度繪製
藍色,淡綠,淡紅,深紅代表了4種不同程度的overdraw情況,
藍色: 意味著overdraw 1倍。畫素繪製了兩次。大片的藍色還是可以接受的(若整個視窗是藍色的,可以擺脫一層)。
綠色: 意味著overdraw 2倍。畫素繪製了三次。中等大小的綠色區域是可以接受的但你應該嘗試優化、減少它們。
淡紅: 意味著overdraw 3倍。畫素繪製了四次,小範圍可以接受。
深紅: 意味著overdraw 4倍。畫素繪製了五次或者更多。這是錯誤的,要修復它們。
我們的目標就是儘量減少紅色 overdraw,最理想的是藍色,乙個畫素只繪製一次,合格的頁面繪製是白色、藍色為主,綠色以上區域不能超過整個的三分之一,顏色越淺越好。
可能有些人覺得不以為然,覺得沒什麼影響。話又說回來,gpu 繪製過渡對應用造成什麼影響。
實際上,gpu 繪製影響的是介面的流暢度和使用者體驗,對於好的手機可能體驗不到差距,對於差的手機,流暢度卻起著關鍵的作用。
下面我們來通過乙個demo來檢測過度繪製:
對比上面的參照圖,可以發現乙個簡單的 recyclerview 展示 item,竟然很多地方被過度繪製了4x 。 那麼,其實主要原因是由於該布局檔案中存在很多不必要的背景,仔細看上述的布局檔案,那麼開始移除吧。
好了,優化了不必要的背景後,我們來看看優化的效果:
下面我們繼續demo走起:
對比上面的參照圖,可以發現乙個簡單的三個展示,竟然也過度繪製了4x 。 那麼,其實主要原因是由於該三個draw的時候繪製了全部區域導致互相重疊,仔細看上述的**,那麼開始優化吧。
優化了以上兩點,可以看一下效果:
所以遇到類似的需要繪製的自定義view時,大家要多注意這方面的問題,這裡只是舉例cliprect方法,還有比如畫兩個圓重疊時,可以畫乙個圓以及乙個圓環,以此類推,這樣可以大大的減少過度繪製,優化ui效能。
Android UI效能優化 Overdraw
什麼是overdraw?overdraw就是螢幕上某個畫素點在同一幀被繪製了多次。在多層布局結構中,不可見部分也會被繪製。舉個例子,乙個白色頁面上有乙個按鈕。系統首先繪製白色背景,然後在白色背景上繪製按鈕,最後在按鈕背景上繪製按鈕內容。那麼按鈕和按鈕內容就造成了overdraw。其實overdraw...
Android UI效能優化(渲染)
谷歌05年初發布效能優化典範,是的開發者學會如何去識別 診斷 解決安卓應用開發中所存在的效能問題。首當其衝的便是渲染的效能優化。在正常的開發中,可以移除不必要的background,以減少繪製的程度。如設定了主布局檔案的背景顏色,就可以移除listview以及listview的items中的一些ba...
效能優化過度繪製
過度繪製對效能會產生不必要的開銷,如果能減少不必要的繪製,將有助於效能的提公升。以下以在手機上進行 debug gpu overdraw 舉例 看到整個螢幕有顏色變化就對了 1 這裡有四層顏色的指示,顏色的層級表示螢幕上有多少畫素過度繪製 什麼是過度繪製,假設你在根檢視viewgroup match...