安卓性能优化 --图片优化

95 篇文章 0 订阅

安卓开发中图片使用的频率也很高,占用的内存也是比较多,如何优化图片成为安卓开发中一个比较常见的问题。

图片的优化大概可以从几个维度优化:图片压缩优化,图片色彩模式优化,图片缓存优化,长图优化

图片压缩优化》图片压缩优化又可以从三个方面优化 图片的尺寸压缩 ,图片的质量压缩,图片的格式转换压缩

图片的尺寸压缩:改变图片的尺寸,比如原图是100*100的,实际我只需要50*50的图片,这时我们就可以把图片缩小一半,图片占用的存储大小和内存大小都缩小了,实测存储大小优化60%左右

图片的质量压缩:改变图片的品质,只能优化图片的存储大小,不能优化内存大小,安卓7.0前底层的libjpeg库考虑安卓手机CPU性能问题,把libjpeg库里面的哈夫曼压缩算法关闭了,(开启哈夫曼算法耗CPU);如果现在手机CPU性能都很好了,我们如果想兼容低版本,我们可以自己集成libjpeg库开启哈夫曼算法。(哈夫曼算法: 例如图片是有由RGB三原色组成的,R G B 每个原色分256个等级,我们以红色图片为例,假如这张图片有5个等级,等级1有500个像素, 等级2有200个像素,等级3有100个像素,等级4有50个像素 ,等级5有10个像素 ;从像素少到多排序就是 5 4 3 2 1; 把最少两个放到底部作为哈夫曼数底部节点左小右大排放,两个相加生成上面一个节点 为60,等级三为100比他大放到右边作为一个节点再相加生成一个新节点,依次排列节点并且把节点连接,最后会生成一个顶部节点,从顶部节点的下面左边节点标记0右边节点标记1,最后效果如下图)

那么等级1的500个像素就可以使用0表示占用一个字节,如果是以前500个像素占用字节就是1000个字节了,这样的性能是很高的 ,所以图片色彩越单一压缩效率越高。总体压缩效果为20%-90%。

图片的格式转换压缩:安卓图片格式有 jpeg png webp三种,jpeg是有损压缩兼容性最好,png是无损压缩色彩最好,占用内存最多,webp可以有损压缩和无损压缩,但是安卓4.0才开始支持。

如果不考虑兼容性问题建议使用webp有损压缩格式 占用内存最少,webp无损压缩兼顾图片色彩时比png占用内存也少。

//实测一张jpg格式图片内存为140KB,转换为webp后占用内存大概是103KB,压缩效率为26%左右

 

图片色彩模式优化》图片是由很多像素组成,像素占内存大小是由色彩模式决定,安卓一般的色彩模式有ARGB888 ,ARGB444,RGB565,;ARGB888 占用4个字节,ARGB444 和RGB565占用2个字节,当ARGB兼容性性能没有RGB565好,腾讯内部建议使用RGB565; RGB565和ARGB888相差50%的空间,优化效率还是比较高的。

 

图片缓存优化》在实际项目中有些图片可能会重复使用,如果每次加载都要申请内存,是很耗内存的,这时使用图片缓存是很有必要的。三级缓存:内存缓存,磁盘缓存,网络缓存。

当我们加载一张图片我们会先从内存缓存找,内存缓存没有找到复用池找,复用池没有再到磁盘缓存找,磁盘缓存有就直接加载 并且保存到内存缓存,没有再到网络找,网络加载到会保存到内存缓存和磁盘缓存。

内存缓存:内部我们可以使用对象池+LRU算法---》LRUCache;LRU算法:最近最少使用算法(内部对象的排序是最近使用最多排前面使用最少排后面,当容器放满会把最后使用最少的移除,把刚使用的放进最前面) 这时移除的我们可以使用一个复用池装载提高复用率,如果被移除的图片内存是可以被复用的我们就放到复用池,没有就一直移除释放,使用弱引用放到复用池,利用弱引用被GC扫描2次后被放到引用队列,在引用队列中图片说明是需要回收释放的,没有被GC扫描到的图片我们就可以复用内存。

磁盘缓存 我们使用diskLRUCache,J神开源库,也是谷歌推荐的。

 

 

长图优化》开发中加载超过屏幕很多的长图或者巨图时,如果我们之间加载很容易导致OOM,其实我们能看到的内容也只要屏幕大小,超出屏幕大小的内容申请到也是浪费,我们可以通过BitmapRegionDecoder类,可以加载图片部分矩形信息,再利用图片图片内存复用,我们只需要屏幕大小内存就可以显示图片所有信息,当然还需要通过滑动监听事件,监听图片滑动时图片需要显示矩形信息。这样我们就可以利用有限的内存显示很大的内存图片。

 

 

 

//测试效果的源码地址:https://github.com/zhudaihao/MyBitmap

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值