天天看點

android釋放res記憶體,Android Res圖檔記憶體占用的一個坑和處理方法

衆所周知... 平時咱們Android手機顯示圖檔的時候,會自動根據目前螢幕DPI(mdpi、hdpi 、xhdpi、xxhdpi )來比對圖檔,如果目前DPI對應的檔案夾下沒有該圖檔這會去臨近DPI下去查找。這就有可能會導緻我們今天要講的主角,圖檔占用記憶體過大。

小夥伴可能會覺得開玩笑吧? 圖檔大小不是天生定好了的嗎?

比如1000*1000像素的照片,預設設定(ARGB_8888)全部加載入記憶體則需要4m的記憶體,這是理想情況下,那不理想是什麼狀态呢?

比如手機分辨率是1080p 那麼對應的就是xxhdip,那麼如果這個時候指定的圖檔在mdpi,那麼記憶體占用會是怎樣的呢?(運作裝置分辨率 1080p)

PS:以下測試為了準确性,隻顯示了一張圖檔且沒有其他任何操作(所有測試均采用同一張圖檔)

android釋放res記憶體,Android Res圖檔記憶體占用的一個坑和處理方法

mdpi.png

android釋放res記憶體,Android Res圖檔記憶體占用的一個坑和處理方法

hdpi.png

android釋放res記憶體,Android Res圖檔記憶體占用的一個坑和處理方法

xhdip.png

android釋放res記憶體,Android Res圖檔記憶體占用的一個坑和處理方法

xxhdpi.png

相同的圖檔,放在不同的檔案夾下,所占記憶體截然不同

例如xxdpi的裝置 使用mdpi檔案夾下的圖檔,系統會自動将mdpi下的圖檔長寬自動放大三倍,也就是說面積放大了9倍,導緻的後果就是:記憶體占用也是沒拉伸放大之前的9倍;

為什麼是三倍呢? mdpi是160dpi,xhdpi是320dpi,xxdpi是480dpi。接下來的就很好了解了吧?

可是大家可能看上圖感覺...最大差距沒有9倍啊, 因為作者将圖檔放在了mipmap中,而用mipmap系統會在縮放上提供一定的性能優化。

為了證明這個觀點我們嘗試删除了mipmap中的圖檔,将圖檔放置在drawable檔案夾中

android釋放res記憶體,Android Res圖檔記憶體占用的一個坑和處理方法

drawable.png

因為圖檔在drawable檔案夾下是沒有縮放優化的,放在drawable預設就是mdpi,so...記憶體占用大的驚人...

總結:

1.需要的圖檔盡可能的覆寫多DPI,以達到較為良好的記憶體占用;

2.如果提供的圖檔尺寸有限,盡可能的有一套高DPI下的圖檔,因為向下收縮所占的記憶體遠小于放大所占的記憶體