android圖片系列 (6) - 使用png圖片內存變化探討

一直以來我總是知道 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: 恩,上面的我也是簡單的跑了跑,能為高玩要是能有更好的資料屏留言發給我,謝啦。項目地址

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容