Android性能優化三個方面
Android的渲染機制,
內存與GC,
電量優化
1.Android渲染機制
垂直同步
Android系統每隔16ms發出VSYNC信號,觸發對UI進行渲染,如果每次渲染都成功,這樣就能達到流暢的畫面所需要的60fps,這意味著程序的大多數操作都要在16ms內完成.
如果你的某個操作花費的時間是24ms,系統在得到VSYNC信號的時候無法進行正常渲染,這樣就發生了丟幀現象,那么用戶在32ms內看到的就是同一副畫面
用戶很容易在UI執行動畫或者滑動ListView的時候感知到卡頓不流暢,是因為這里的操作相對復雜,容易發生丟幀現象,從而感覺卡頓,有很多原因可以導致丟幀,
也許是因為你的Layout太過復雜,無法再16ms內完成繪制,也有可能是因為你的UI上有太多的繪制單元,還有可能是動畫執行的次數過多,這些都會導致CPU或者GPU負擔過重
為了理解APP是怎樣進行渲染的,我們必須了解手機硬件是如何工作的,那么就必須理解什么是VSYNC,
在講解VSYNC之前我們需要理解兩個相關概念,
- Refresh Rate:代表屏幕在1s內刷新的次數,這取決于硬件的固定參數,例如60HZ;
- Frame Rate:代表GPU在1s內繪制操作的幀數,例如30fps,60fps
GPU會獲取圖形進行渲染,然后硬件負責把渲染后的內容呈現到屏幕上,他們兩者不停地協作,不幸的是,刷新頻率
和幀率并不是總能保持相同的節奏,如果發生幀率與刷新頻率不一致的情況,就會容易出現Tearing的現象(畫面上下兩部分顯示內容發生斷裂,來自不同的兩幀數據發生重疊)。
通常來說,幀率超過刷新頻率只是一種理想的狀況,在超過60fps的情況下,GPU所產生的幀數據會因為等待VSYNC的刷新信息而被Hold住,這樣能夠保持每次刷新都有實際的新的數據可以顯示。但是我們遇到更多的情況是幀率小于刷新頻率。在這種情況下,某些幀顯示的畫面內容就會與上一幀的畫面相同。糟糕的事情是,幀率從超過60fps突然掉到60fps以下,這樣就會發生LAG,JANK,HITCHING等卡頓掉幀的不順滑的情況。這也是用戶感受不好的原因所在
過度繪制(overDraw)
OverDraw描述的是屏幕上的某個像素在同一幀的時間內被繪制了很多次,在多層次的UI結構里面,如果不可見
的UI也在做繪制的操作,這就會導致某些像素區域被繪制了多次,這就浪費大量的GPU和CPU資源
當設計上追求更華麗的效果的時候,我們容易陷入采用越來越多的層疊組件來實現這種視覺效果的怪圈,這很容易導致大量的性能問題,
為了獲得最佳的性能,我們必須盡量少讓OverDraw的情況發生
為什么60fps為流暢
我們通常都會提到60fps與16ms,可是知道為何會是以程序是否達到60fps來作為App性能的衡量標準嗎?這是因為人眼與大腦之間的協作無法感知超過60fps的畫面更新。
12fps大概類似手動快速翻動書籍的幀率,這明顯是可以感知到不夠順滑的。24fps使得人眼感知的是連續線性的運動,這其實是歸功于運動模糊的效果。24fps是電影膠圈通常使用的幀率,因為這個幀率已經足夠支撐大部分電影畫面需要表達的內容,同時能夠最大的減少費用支出。但是低于30fps是無法順暢表現絢麗的畫面內容的,此時就需要用到60fps來達到想要的效果,當然超過60fps是沒有必要的。
開發app的性能目標就是保持60fps,這意味著每一幀你只有16ms=1000/60的時間來處理所有的任務。