Glide圖片記憶體優化分析
阿新 • • 發佈:2018-12-31
基於以上問題,有些元件開始用 強引用+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,接近也會造成卡頓,因為還會有其他的函式執行。