1. 程式人生 > >Android效能優化之檢視篇(渲染機制)

Android效能優化之檢視篇(渲染機制)

**

本篇重點是——–如何解決過度繪製

**
眾所周知的Android系統每隔16ms重新繪製一次activity,也就是說你的app必須在16ms內完成螢幕重新整理的所有邏輯操作,這樣才能達到60幀/s。而使用者一般所看到的卡頓是由於Android的渲染效能造成的。
16繪製
然而有的時候你的程式會出現這樣的情況,如果某個繪製操作超過了16ms用了24ms這時候使用者看同一張圖片花了32ms而不是16ms,使用者會感到卡頓,這種現象我們叫-丟幀
丟幀
那麼我們要了解是如何出現這種情況並如何去解決,
首先我們要了解android的渲染機制

android 的渲染主要分為兩個元件

1.CPU 2.GPU由這兩者共同完成在螢幕上繪製


CPUGPU
要想優化我們必須瞭解其原理
&nbsp&nbsp Activity如何將複雜的UI轉換成使用者看得懂的影象並繪製到螢幕上?
這是由格柵化操作完成的格柵化將字串,按鈕,路徑或者形狀的一些高階物件拆分到不同的畫素上在螢幕上進行顯示,這是一個非常耗時的操作而手機裡有一塊硬體就是為了加速完成這個操作就是GPU(影象處理單元)現在Gpu使用些基礎指令集主要是多邊形與紋理也就是圖片
簡單理解的過程
CPU在影象繪製之前向GPU輸入這些指令這一過程通過OpenGL-ES
也就是說在螢幕繪製UI物件的時候都需要在CPU中轉化成多邊形再傳遞GPU進行格柵化操作

cpu將物件轉換為多邊形耗時 同樣上傳到GPU也耗時所以我們要減少物件轉換次數以及上傳資料的次數,幸運的是OpenGL-ES API允許資料上傳到GPU進行資料儲存,當下一次繪製按鈕的時候只要在CPU的儲存器裡引用它
所以渲染效能的優化就是儘快的上傳資料到GPU儘可能長的在不修改資料的條件下儲存資料
雖然android系統已經完成的大部分的優化但是還有一個問題造成了效能的影響–>過度繪製(OverDraw)

那麼什麼是過度繪製呢
螢幕上的某個畫素點在同一幀的時間內繪製了多次
當設計上追求更華麗的視覺效果的時候,我們就容易陷入採用越來越多的層疊元件來實現這種視覺效果的怪圈。這很容易導致大量的效能問題,為了獲得最佳的效能,我們必須儘量減少Overdraw的情況發生。
繪製等級
藍色,淡綠,淡紅,深紅代表了4種不同程度的Overdraw情況,我們的目標就是儘量減少紅色Overdraw,看到更多的藍色區域。
這裡寫圖片描述
我們可以通過手機設定裡面的開發者選項,開啟Show GPU Overdraw的選項,可以觀察UI上的Overdraw情況。也可以使用HierarchyViewer來查詢Activity中的佈局是否過於複雜

如何清除過度繪製的兩種方法
1.從檢視中清除那些不必要的背景和圖片使他們不會再最終渲染影象中顯示
(1).將activity中的主題背景置為空減少與xml中的背景色覆蓋getwindow().setBackGroundDrawable(null);
(2).去掉不必要的佈局背景圖片
2.對檢視中重疊的區域進行定義從而降低CPU -GPU的消耗
(1).避免繪製在最終圖片中不顯示的UI元件稱之為剪輯,這是系統完成的但是不適合在自定義View中,我們可以通過canvas.clipRect通過定義可見邊界避免繪製被遮擋住的部分
(2).也可以通過canvas.quickReject判斷給定區域是否在剪輯區域之外這裡寫圖片描述
3. layout重新整理避免複雜的層級結構巢狀
這裡我們可以通過HierarchyViewer工具來分析我們開啟之後會看到下面這樣的層級結構可以幫你區分出沒用的佈局以及各個過程的相對速度
檢視結構
下圖的三個小原點 紅色表示檢視管道中最慢 綠色快於一般的50%黃色慢於一般的50%
左側是渲染管道測量階段
中間是佈局階段
最後是渲染管道繪製階段
根據此來優化你的檢視
觀察View分析速率
由於CSDN圖片上傳失敗具體操作方法請看下面
如何使用HierarchyViewer