Android性能優化(七)Bitmap內存壓縮

一、Bitmap內存佔用

內存大小計算

  ARGB_8888

  ARGB各佔8位,即WIDTH*HEIGHT*4

 

 RGB_565

    R5位,G6位,B5位,即16位 WIDTH*HEIGH*2

 

getByteCount

  返回可用於存儲此位圖像素的最小字節數。

 

BitmapFactory.Options

  控制解碼圖片參數

 

inDensity:

  表示這個bitmap的像素密度,根據drawable目錄

 

inTargetDensity:

  表示要被畫出來時的目標(屏幕)像素密度 , getResources().getDisplayMetrics().densityDpi

 

二、Bitmap內存壓縮

 

BitmapFactory.Options

 

inJustDecodeBounds  

  讀取圖片out…系列參數,如outWidth與outHeight,可用於計算內存大小

inPreferedConfig  

  設置圖片解碼後的像素格式,如ARGB_8888/RGB_565

inSampleSize  

  設置圖片解碼縮放比,如值爲4,則加載圖片寬高是原圖的1/4,內存大小則是1/16

 

對於內存的降低,無論是選擇jpg還是png更或者是webp。其實都是毫無意義的。Jpg是屬於有損壓縮,我們看見的jpg比png文件小,那是因爲壓縮率高。這都是屬於文件存儲範疇。對於內存來說,我們加載一張不帶alpha通道使用RGB_565格式的png與一張jpg佔用的內存大小都是一樣的。

 

對於內存的壓縮我們能做的就是縮小圖片尺寸與改變像素格式。

 

三、Bitmap內存優化

https://developer.android.google.cn/topic/performance/graphics/manage-memory.html

https://developer.android.google.cn/samples/DisplayingBitmaps/index.html

inBitmap複用

 

四、LruCache

  android提供的一個緩存工具類,使用LRU緩存淘汰算法。

  根據數據的歷史訪問記錄來進行淘汰數據, “如果數據最近被訪問過,那麼將來被訪問的機率也更高”。

1. 新數據插入到鏈表頭部;

2. 每當緩存命中(即緩存數據被訪問),則將數據移到鏈表頭部;

3. 當鏈表滿的時候,將鏈表尾部的數據丟棄。

 

DiskLruCache

https://github.com/JakeWharton/DiskLruCache

 

五、LinkedHashMap

雙向鏈表

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章