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

双向链表

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