1. 程式人生 > >Android效能優化——渲染、記憶體、電源優化

Android效能優化——渲染、記憶體、電源優化

越整理越要找更多資料,越寫越發覺自己不懂的東西更多。學習的路還很長…

本文主要從 介面,記憶體,電量優化三個方面展開,梳理一下自己的知識。

介面、GPU

渲染效能

大多數使用者感知到的卡頓等效能問題的最主要根源都是因為渲染效能。從設計師的角度,他們希望App能夠有更多的動畫,圖片等時尚元素來實現流暢的使用者體驗。但是Android系統很有可能無法及時完成那些複雜的介面渲染操作。
Android系統每隔16ms發出VSYNC訊號,觸發對UI進行渲染,如果每次渲染都成功,這樣就能夠達到流暢的畫面所需要的60fps,為了能夠實現60fps,這意味著程式的大多數操作都必須在16ms內完成。
這裡寫圖片描述


如果你的某個操作花費時間是24ms,系統在得到VSYNC訊號的時候就無法進行正常渲染,這樣就發生了丟幀現象。那麼使用者在32ms內看到的會是同一幀畫面。
這裡寫圖片描述
(fps:每秒傳輸幀數。人眼與大腦之間的協作無法感知超過60fps的畫面更新。)

失幀原因:

使用者容易在UI執行動畫或者滑動ListView的時候感知到卡頓不流暢,是因為這裡的操作相對複雜,容易發生丟幀的現象,從而感覺卡頓。有很多原因可以導致丟幀,也許是因為你的layout太過複雜,無法在16ms內完成渲染,有可能是因為你的UI上有層疊太多的繪製單元,還有可能是因為動畫執行的次數過多。這些都會導致CPU或者GPU負載過重。

  • layout太過複雜
  • UI層級太深

優化方法:

佈局優化:

  • 刪除佈局中無用的控制元件和層級
  • 選擇效能較低的viewGroup(FrameLayout>LinearLayout>RelativeLayout

繪製優化:

  • 移除Window預設的Background (getWindows().setBackgroudDrawable(null))
  • 移除XML佈局檔案中非必需的Background
  • 按需顯示佔位背景圖片
  • clipRect方法(繪製指定區域)<>

工具

  • 開發者選項裡面的 Show GPU view updates:檢視檢視更新的操作
  • HierarchyViewer:檢視佈局,使得佈局儘量扁平化,移除非必需的UI元件,這些操作能夠減少Measure,Layout的計算時間。

記憶體、CPU

雖然Android有自動管理記憶體的機制,但是對記憶體的不恰當使用仍然容易引起嚴重的效能問題。
Android執行GC操作的時候,所有執行緒的任何操作都會需要暫停,等待GC操作完成之後,其他操作才能夠繼續執行。
通常來說,單個的GC並不會佔用太多時間,但是大量不停的GC操作則會顯著佔用幀間隔時間(16ms)。如果在幀間隔時間裡面做了過多的GC操作,那麼自然其他類似計算,渲染等操作的可用時間就變得少了,並使得使用者感知到效能問題(卡頓,資料被GC掉)。
導致GC頻繁執行de原因:

  • Memory Churn記憶體抖動,記憶體抖動是因為大量的物件被建立又在短時間內馬上被釋放。

造成記憶體不恰當使用的因素:

  • (記憶體抖動)大量的物件被建立又在短時間內馬上被釋放導致頻繁GC。
  • (記憶體洩漏)不必要的資料不易被GC 導致記憶體佔用過大,必要資料被優先清除。
  • 使用佔用記憶體大的物件
  • 記憶體物件沒有被重複利用

工具:

為了尋找記憶體的效能問題,Android Studio提供了工具來幫助開發者。

  • Memory Monitor:檢視整個app所佔用的記憶體,以及發生GC的時刻。(短時間內發生大量的GC操作是一個危險的訊號。)
  • Allocation Tracker:使用此工具來追蹤記憶體的分配。
  • Heap Tool:檢視當前記憶體快照,便於對比分析哪些物件有可能是洩漏了的。

策略

  • 減少物件佔用的記憶體
  • 記憶體de重複利用
  • 避免物件的記憶體洩露
  • 記憶體使用策略優化

電源

電量其實是目前手持裝置最寶貴的資源之一,大多數裝置都需要不斷的充電來維持繼續使用。
千萬不能讓你的應用成為消耗電量的大戶。

有下面一些措施能夠顯著減少電量的消耗:

  • 我們應該儘量減少喚醒螢幕的次數與持續的時間,使用WakeLock來處理喚醒的問題,能夠正確執行喚醒操作並根據設定及時關閉操作進入睡眠狀態。
  • 某些非必須馬上執行的操作,例如上傳歌曲,圖片處理等,可以等到裝置處於充電狀態或者電量充足的時候才進行。
  • 觸發網路請求的操作,每次都會保持無線訊號持續一段時間,我們可以把零散的網路請求打包進行一次操作,避免過多的無線訊號引起的電量消耗。關於網路請求引起無線訊號的電量消耗,還可以參考這裡:http://blog.csdn.net/sinat_15877283/article/details/50762297

獻上我寫這邊博文的大綱:

這裡寫圖片描述

專案中一直需要考慮的問題:如何高效的保留更多的電量與不斷促使使用者使用你的App會消耗電量!!!