1. 程式人生 > >Android面試系列文章2018之記憶體管理之UI卡頓篇

Android面試系列文章2018之記憶體管理之UI卡頓篇

Android面試系列文章2018之記憶體管理之UI卡頓篇

1.UI卡頓的原理

  60ftp –> 16ms: Android系統每隔16ms都會對介面進行渲染一次,造成卡頓的原因就是Android系統在渲染的時候丟幀了, 16ms = 1000/60hz,相當於60fps(每秒幀率)。這是因為人眼與大腦之間的協作無法感知超過60fps的畫面更新。12fps大概類似手動快速翻書的幀率,這個速度明顯可以感知是不夠順滑的。24fps使得人眼感知的是連續線性運動,24fps是電影膠圈通常使用的幀率,這個幀率可以支撐大部分電影畫面需要表達的內容。但是地域30fps是無法順暢表現絢麗的畫面內容,此時需要使用60fps來達到想要的效果。因此,如果應用沒有在16ms內完成螢幕重新整理的全部邏輯操作,就會發生卡頓。因為Android系統每隔16ms就會發出VSYNC訊號,觸發對UI進行渲染,VSYNC是Vertical Synchronization(垂直同步)的縮寫,可以簡單的把它認為是一種定時中斷。在Android 4.1中開始引入VSYNC機制。

  過度繪製(overdraw): Overdraw(過度繪製)描述的是螢幕上的某個專案在同一幀內被繪製了多次。在多層次的UI結構裡面,如果不可見的UI也在做繪製的操作,這就會導致某些畫素區域內繪製了 多次,這就浪費了大量的CPU以及GPU資源。可以開啟除錯工具,開啟開發者設定來顯示GPU過度繪製顯示情況。一般步驟:設定-> 開發者選項->除錯GPU過度繪製->顯示GPU過度繪製 (不同的手機操作路徑不一致,但是大體差不多)

深紅: 意味著overdraw 4倍。畫素繪製了5次或者更多,這是錯誤的,需要修復;
淡紅: 意味著overdraw 3倍。畫素繪製了4次,小範圍可以接受。
綠色: 意味著overdraw 2倍。畫素繪製了3次。中等大小的綠色區域是可以接受的,但是還是應該優化,減少他們。
藍色: 意味著overdraw 1倍。畫素繪製了2次。大片的啦色還是可以接受的。

優化的目標就是減少紅色的Overdraw,看到更多的藍色區域。

2.UI卡頓原因

[1]人為在UI執行緒中做輕微耗時操作,導致UI執行緒卡頓。

[2]佈局Layout過於複雜,無法在16ms內完成渲染。

[3]同一時間動畫執行次數過多,導致CPU或者GPU負載過重。

[4]View過度繪製,導致某些畫素在同一幀時間內被繪製多次,從而使CPU或者GPU負載過重。

[5]View頻繁的觸發measure,layout,導致measure,layout累計耗時過多以及整個View頻繁的重新渲染。

[6]記憶體頻繁觸發GC過多,導致暫時阻塞渲染操作。

[7]冗餘資源以及邏輯等導致載入或執行緩慢。

[8]ANR(輕量版)。

3.解決方法

1.佈局優化 
  儘量不存在佈局冗餘巢狀以及過於複雜的佈局。如果有重用的佈局使用include標籤。< merge >標籤是作為< include >標籤的一種輔助擴充套件來使用的,它的主要作用是為了防止在引用佈局檔案時產生多餘的佈局巢狀。大家都知道,Android去解析和展示一個佈局是需要消耗時間的,佈局巢狀的越多,那麼解析起來就越耗時,效能也就越差,因此我們在編寫佈局檔案時應該讓巢狀的層數越少越好。

http://blog.csdn.net/guolin_blog/article/details/43376527

2.列表及Adapter優化 
  使用View的重用機制。在列表滑動的時候,不要去載入資源,顯示預設的資源或者圖片的縮圖,在列表滑動結束的時候再載入。

3.背景和圖片等記憶體分配的優化 
  儘量減少一些背景中不必要的設定,背景圖片儘量進行壓縮處理。

4.避免ANR 
  在主執行緒(UI執行緒)不要進行耗時操作。