2015年伊始,Google發布了關於Android性能優化典范的專題,一共16個短視頻,每個3-5分鐘,幫助開發者創建更快更優秀的Android App。課程專題不僅僅介紹了Android系統中有關性能問題的底層工作原理,同時也介紹了如何通過工具來找出性能問題以及提升性能的建議。主要從三個方面展開,Android的渲染機制,內存與GC,電量優化。下面是對這些問題和建議的總結梳理。
大多數用戶感知到的卡頓等性能問題的最主要根源都是因為渲染性能。從設計師的角度,他們希望App能夠有更多的動畫,圖片等時尚元素來實現流暢的用戶體驗。但是Android系統很有可能無法及時完成那些復雜的界面渲染操作。Android系統每隔16ms發出VSYNC信號,觸發對UI進行渲染,如果每次渲染都成功,這樣就能夠達到流暢的畫面所需要的60fps,為了能夠實現60fps,這意味著程序的大多數操作都必須在16ms內完成。
如果你的某個操作花費時間是24ms,系統在得到VSYNC信號的時候就無法進行正常渲染,這樣就發生了丟幀現象。那麼用戶在32ms內看到的會是同一幀畫面。
用戶容易在UI執行動畫或者滑動ListView的時候感知到卡頓不流暢,是因為這裡的操作相對復雜,容易發生丟幀的現象,從而感覺卡頓。有很多原因可以導致丟幀,也許是因為你的layout太過復雜,無法在16ms內完成渲染,有可能是因為你的UI上有層疊太多的繪制單元,還有可能是因為動畫執行的次數過多。這些都會導致CPU或者GPU負載過重。
我們可以通過一些工具來定位問題,比如可以使用HierarchyViewer來查找Activity中的布局是否過於復雜,也可以使用手機設置裡面的開發者選項,打開Show GPU Overdraw等選項進行觀察。你還可以使用TraceView來觀察CPU的執行情況,更加快捷的找到性能瓶頸。
Overdraw(過度繪制)描述的是屏幕上的某個像素在同一幀的時間內被繪制了多次。在多層次的UI結構裡面,如果不可見的UI也在做繪制的操作,這就會導致某些像素區域被繪制了多次。這就浪費大量的CPU以及GPU資源。
當設計上追求更華麗的視覺效果的時候,我們就容易陷入采用越來越多的層疊組件來實現這種視覺效果的怪圈。這很容易導致大量的性能問題,為了獲得最佳的性能,我們必須盡量減少Overdraw的情況發生。
幸運的是,我們可以通過手機設置裡面的開發者選項,打開Show GPU Overdraw的選項,可以觀察UI上的Overdraw情況。
藍色,淡綠,淡紅,深紅代表了4種不同程度的Overdraw情況,我們的目標就是盡量減少紅色Overdraw,看到更多的藍色區域。
Overdraw有時候是因為你的UI布局存在大量重疊的部分,還有的時候是因為非必須的重疊背景。例如某個Activity有一個背景,然後裡面的Layout又有自己的背景,同時子View又分別有自己的背景。僅僅是通過移除非必須的背景圖片,這就能夠減少大量的紅色Overdraw區域,增加藍色區域的占比。這一措施能夠顯著提升程序性能。
為了理解App是如何進行渲染的,我們必須了解手機硬件是如何工作,那麼就必須理解什麼是VSYNC。
在講解VSYNC之前,我們需要了解兩個相關的概念:
GPU會獲取圖形數據進行渲染,然後硬件負責把渲染後的內容呈現到屏幕上,他們兩者不停的進行協作。
不幸的是,刷新頻率和幀率並不是總能夠保持相同的節奏。如果發生幀率與刷新頻率不一致的情況,就會容易出現Tearing的現象(畫面上下兩部分顯示內容發生斷裂,來自不同的兩幀數據發生重疊)。
理解圖像渲染裡面的雙重與三重緩存機制,這個概念比較復雜,請移步查看這裡:http://source.android.com/devices/graphics/index.html,還有這裡http://article.yeeyan.org/view/37503/304664。
通常來說,幀率超過刷新頻率只是一種理想的狀況,在超過60fps的情況下,GPU所產生的幀數據會因為等待VSYNC的刷新信息而被Hold住,這樣能夠保持每次刷新都有實際的新的數據可以顯示。但是我們遇到更多的情況是幀率小於刷新頻率。
在這種情況下,某些幀顯示的畫面內容就會與上一幀的畫面相同。糟糕的事情是,幀率從超過60fps突然掉到60fps以下,這樣就會發生LAG,JANK,HITCHING等卡頓掉幀的不順滑的情況。這也是用戶感受不好的原因所在。
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2015-03/114409p2.htm