1. 程式人生 > >Glide圖片記憶體優化分析

Glide圖片記憶體優化分析

基於以上問題,有些元件開始用 強引用+LRU演算法 的方式處理圖片載入的問題,其思路大概是:

給定一個固定圖片快取大小,將所有的使用的Bitmap用強引用的方式管理起來,並利用LRU演算法,將舊的Bitmap釋放,新的bitmap增加。

這樣,圖片快取不會無限制的增長,記憶體量也能處在一個較理想的範圍,申請和釋放。UIL就是採用這種方法。

但這個思路也會有 問題 :

圖片快取的記憶體不會無限制增長,但會週期性的釋放和申請。特別是對於一個長列表頁面,圖片會不斷的申請,不斷的釋放。因為最終的記憶體釋放還是GC去處理,快速滑動時,會造成大量的圖片申請記憶體,大量的圖片釋放,系統的GC會很頻繁,就產生了所謂的 記憶體抖動

 。

記憶體的抖動同樣也會造成介面卡頓,在快速滑動時,會非常明顯。

提到介面卡頓,我要說明下 卡頓的原因 。

人眼能識別的幀數是一秒24幀,就是所若一個螢幕以每秒24幀顯示時,人眼是看不出什麼的,感覺很流暢。但若少於24幀,我們就能感覺出卡頓,不流暢。 最佳的幀數是每秒60幀,再高就沒有任何意義了,一般顯示卡會跟螢幕的重新整理速率保持一致,大部分都是60hz。

那我們來計算下,最高60幀,1000ms/60幀=16ms/幀,最低24幀,1000ms/24幀=42ms,也就是說每次ui執行緒裡面的計算最佳的情況是少於16ms,最高則不能超過42ms。

以ListView為例,getView的執行時間不能大於42ms, 推薦大家用 

hugo 統計執行時間,很方便。

特殊情況下,即便是不大於42ms,接近也會造成卡頓,因為還會有其他的函式執行。