Android效能優化 筆記
1.Android效能優化之渲染篇
1.VSYNC
- 幀率:GPU在1秒內繪製操作的幀數.如60fps.
- 我們通常都會提到60fps與16ms,這是因為人眼與大腦之間的協作無法感知超過60fps的畫面更新.
- 開發app的效能目標就是保持60fps,這意味著每一幀只有16ms=1000/60的時間來處理所有的任務
- 重新整理率:螢幕在1秒內重新整理螢幕的次數.如60Hz,每16ms重新整理1次螢幕.
- GPU獲取圖形資料進行渲染,然後螢幕將渲染後的內容展示在螢幕上.
- 大多數手機螢幕的重新整理率是60Hz,如果GPU渲染1幀的時間低於1000/60=16ms,那麼在螢幕重新整理時候都有最新幀可顯示.如果GPU渲染某1幀 f 的時間超過16ms,在螢幕重新整理時候,f並沒有被GPU渲染完成則無法展示,螢幕只能繼續展示f的上1幀的內容.這就是掉幀,造成了UI介面的卡頓.
下面展示了幀率正常和幀率低於重新整理率(掉幀)的情形
2.GPU渲染:GPU渲染依賴2個元件:CPU和GPU


- CPU負責Measure,Layout,Record,Execute操作.
- GPU負責Rasterization(柵格化)操作.
- Resterization柵格化是繪製那些Button,Shape,Path,String,Bitmap等元件最基礎的操作.它把元件拆分到不同的畫素上進行顯示.這是一個很費時的操作.
- CPU負責把UI元件計算成Polygons(多邊形),Texture(紋理),然後交給GPU進行柵格化渲染.
- 為了App流暢,我們需要確保在16ms內完成所有CPU和GPU的工作.
3.過度繪製
Overdraw過度繪製是指螢幕上的某個畫素在同一幀的時間內被繪製了多次.過度繪製會大量浪費CPU及GPU資源/佔用CPU和GPU的處理時間
- 過度繪製的原因
- UI佈局存在大量重疊
- 非必須的背景重疊.
- 如Activity有背景,Layout又有背景,子View又有背景.僅僅移除非必要背景就可以顯著提升效能.
- 子View在onDraw中存在重疊部分繪製的情況,比如Bitmap重疊繪製