Android性能优化(八)--Android图片内存优化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android性能优化(八)--Android图片内存优化相关的知识,希望对你有一定的参考价值。

参考技术A

2个基本原则

既然需要的内存公式已得到,那优化就显而易见了,无非就是减小的这三个参数的值,具体的策略如下:
这里我们将图片分为2种情况来探讨:

图片占用的内存 大小为:

为什么mipmap不在这种情况的考虑范围之内呢?
因为mipmap是android系统为了避免Launcher Icon变形而添加的资源目录,也就是说,mipmap中的图片不会被缩放。所以Google也不推荐将除Launcher Icon之外的图片放在mipmap目录中。

本地图片通常都是通过Android提供的BitmapFactory来加载的, 这里看几个常用的API:

图片的优化可通过Options参数来实现(Options的介绍可参考 从fresco 看图片优化 :

inPreferredConfig的取值为Bitmap.Config类型(这里只考虑以下几种情况),它是一个枚举类型,用来设置每个像素需要的字节数:

1.jpeg和gif

2.webp

3.png8, png24, png32

网络图片通常我们都是使用开源库进行加载, 所以不需要拿到Bitmap再进行缩放或裁剪。
这时可让后台实现网络图片的裁剪,即:根据图片的请求参数返回合适的尺寸,最大也只需要控件的大小即可。
再大也没意义,不仅浪费流量,还占用内存。
如果你的APP中有很多图片,那么可对图片的宽高根据设备的内存情况进行适当的缩小:

尽量为所有分辨率创建资源 资源匹配分辨率 = 减少不必要的缩放,从而提高UI绘制效率

对于一个多图片的APP来说,图片所占内存的优化是一项必不可少的工作。
总的来说,其优化也就是通过 缩放 和指定 Bitmap.Config的值 来实现的,只是不同位置,不同格式的图片有所差异而已。

https://juejin.im/post/5af84f4b51882542714fdaa9?utm_medium=an&utm_source=weixinqun

Android应用性能优化系列视图篇——SVG图片版本兼容及性能优化解决方案

SVG矢量图在图片表现力方面远远优于PNG位图,同时在可维护性和修改性方面也比位图要方便很多。尽管Android在5.0版本就引入了SVG图片的解决方案:Vector。然而,兼容性和性能方面却是差强人意,以至于至今都未能广泛使用。

同样的,常用另一套SVG图片解决方案IconFont,在使用性、功能甚至性能方面有非常多的局限性。

本篇博客给大家带来一套较为不错的解决方案:SVG-Android,相比于Vector,其在兼容性方面能够兼容到4.0及以上,同时在性能方面,也有了质的提升。

开源库地址:https://github.com/MegatronKing/SVG-Android

PS:主要思想参考的微信的SVG解决方案。


一、SVG-Android效果演示

这里写图片描述 这里写图片描述
这里写图片描述 这里写图片描述
这里写图片描述 这里写图片描述

完整范例下载:
https://github.com/MegatronKing/SVG-Android/raw/master/SVG-Sample.apk


二、SVG-Android接入文档

1、SVG-Android系列之项目接入和使用

2、SVG-Android系列之图片颜色Manage、Tint及Selector扩展

3、SVG-Android开源库——关于动画的使用


三、SVG-Android实现原理

1、预解析

从对Vector的性能测试数据来看,大部分耗时都在解析xml和绘制渲染两个阶段。为了提高性能,SVG-Android的做法是将部分耗时操作由运行时转移到编译前,也就是预解析。同时,由于svg文件的fillData的数据在Android中表现为Path,这部分计算量也是可以预先计算好的。

所以,SVG-Generator库会将Vector文件提前解析生成用于直接渲染的SVGRenderer类,另外fillData的每个指令数也会预先计算好,直接生成Java Path代码,SVGDrawable只要通过SVGRenderer就能画出svg图形了。

这里写图片描述

2、无感知

为了提高开发效率,我们希望开发者在使用SVG图片的时候能够和使用常规的PNG一样,可以在layout文件中直接使用@drawable/xxx,或者java代码中使用R.drawable.xxx。为了解决这个问题,我们采用偷天换日的方式,使用SVG-Generator生成一张空的shape文件,放入到drawable-anydpi中,同时会将对应的SVGDrawableConstantState预先注入到Resources的sPreloadedDrawables缓存中,拦截掉所有对shape的获取请求。

这里写图片描述


本博客不定期持续更新,欢迎关注和交流:

http://blog.csdn.net/megatronkings

以上是关于Android性能优化(八)--Android图片内存优化的主要内容,如果未能解决你的问题,请参考以下文章

Android性能优化之图片压缩优化

Android App 性能优化之图片优化

Android App 性能优化之图片优化

Android性能优化系列之Bitmap图片优化

Android应用性能优化系列视图篇——SVG图片版本兼容及性能优化解决方案

Android应用性能优化系列视图篇——隐藏在资源图片中的内存杀手