一直以來我總是知道 png 機器耗費內存,但是在我們大量使用 png 圖片后,集合系統的 CG 垃圾回收機制,內存的具體變化又是怎么的呢,今天就來特意的玩一玩
android顯示圖片的基礎是bitmap 位圖顯示機制,我們使用的靜態 png 圖片在顯示時也是以 bitmap 來顯示的,所以 android 中使用靜態 png圖片還是網絡圖片資源都是以 bitmap 核心來顯示的,內存占用和變化頁都是一樣的,所以我使用靜態 png 圖片來簡單的模擬一下
測試設計
我在 app 中放入5張 1080p 的 png 圖片,還有一張系統的 icon,點擊圖片讓其切換顯示到下一張,點擊的速度略快,以模擬我們平時大量加載網絡端資源,然后結合一下手動 bitmap 資源回收看一下
代碼:
// 圖片切換方法
public void nextImage(View view) {
List<Integer> images = getImages();
if (index == images.size() - 1) {
index = 0;
}
// recycleBitmap(image);
image.setImageResource(images.get(index));
index++;
}
// 手動位圖資源回收
private void recycleBitmap(ImageView imageView) {
Drawable drawable = imageView.getDrawable();
if (drawable != null && drawable instanceof BitmapDrawable) {
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
Bitmap bitmap = bitmapDrawable.getBitmap();
if (bitmap != null && !bitmap.isRecycled()) {
bitmap.recycle();
}
}
}
代碼很簡單,我們來看下效果圖:
我們使用 app:
ezgif.com-video-to-gif.gif
不手動回收bitmap 資源:
no-recycle.png
手動回收bitmap 資源:
recycle.png
對比結果
沒有對比就看不到差距,因為我用的都是1080p 大圖,所以單張圖占用內存頗大,效果比較明顯
-
內存占用:
- app 不加載圖片時起始占用3.7M內存
- 手動回收bitmap 資源時:內存占用峰值58M,最后不動時占用54M
- 不收回 bitmap 資源時:內存占用峰值85M,最后不動時占用38M
-
CG 波動:
- 手動回收bitmap 資源時:CG 平滑很多,比較頻繁的
- 不收回 bitmap 資源時:CG 波動很尖銳,非常頻繁
從上面的對比可以看到,我們平時多多回收 bitmap 位圖資源效果還是很明顯的,但是資源占用和 CG 還是很不理想的,所以有一下幾個結論大家參考下:
- 結合圖片加載庫,首先把庫的內存緩存設置小一點,其次在頁面關閉時手動清理圖片內存緩存庫,最后在顯示圖片變換時多多手動清理 bitmap 位圖資源
- 對于app 的靜態 png圖片,分辨率能小就小,盡可能的使用 SVG 矢量圖代替 png 圖片,SVG 矢量圖我們可以設置成1dp*1dp 的,會節省很對內存資源。
ps: 恩,上面的我也是簡單的跑了跑,能為高玩要是能有更好的資料屏留言發給我,謝啦。項目地址