内存优化-Android大图片

最近在做一个游戏项目,项目中使用大量的1080P作为背景图片,整个APP内存很快就超过峰值,导致项目中出现多处内存溢出、掉帧现象。

Meizu Mx4pro(260M左右)仅供参考
XiaoMi (260M左右)仅供参考
三星S8(260M左右)仅供参考

调试手机用的是魅族MX4,以一张1280*720大背景图片为样例,我们来计算下一张720P图片占用内存
Android 默认使用的ARGB_8888,也就是32位
一张720P图片占用内存:

12807204/1024/1024=3.515625M

下面我们使用代码测试下内存使用情况:

ImageView iv= (ImageView) findViewById(R.id.test);BitmapFactory.Options options = new BitmapFactory.Options();//设置图片比率,1是1/1、2是1/2、3是1/3,设置该参数会影响图片的质量 options.inSampleSize =1;//ALPHA_8就是Alpha由8位组成//ARGB_4444就是由4个4位组成即16位,//ARGB_8888就是由4个8位组成即32位,//RGB_565就是R为5位,G为6位,B为5位共16位options.inPreferredConfig = Bitmap.Config.ARGB_8888;Bitmap img =BitmapFactory.decodeResource(getResources(),R.drawable.hall_bg,options);iv.setImageBitmap(img);   Log.d("MainTest",""+img.getRowBytes()*img.getHeight()/(1024*1024));
目录 内存
drawable 56.25M

一张1280*720图片,放在drawable目录下,测试占用内存

目录 内存
drawable 56.25M

这和我们前面算出的内存不一致,测试发现放在drawable目录下对应的图片会进行相应拉伸,魅族MX4Pro宽高各拉伸了4

drawable目录下内存 443.5=56.25M** 刚好

不同的手机测试内存大小不一致,小米手机宽高拉伸3倍,中兴手机测试宽高拉伸2倍多

于是决定把官方所有的目录测试一遍,对应目录如下

这里写图片描述
目录 占用内存
drawable 56.25M
drawable-anydpi 3.47M
drawable-hdpi 24.99M
drawable-ldpi 100M
drawable-mdpi 56.25M
drawable-nodpi 3.51M
drawable-xhdpi 14.06M
drawable-xxhdpi 6.25M
drawable-xxxhdpi 3.51M
mipmap 56.25M
mipmap-anydpi 3.47M
mipmap-hdpi 24.99M
mipmap-ldpi 100M
mipmap-mdpi 56.25M
mipmap-nodpi 3.51M
mipmap-xhdpi 14.06M
mipmap-xxhdpi 6.25M
mipmap-xxxhdpi 3.51M

经过上面的测试后得出一个优化方案

资源目录处理:

所有的大背景图片,统一放在mipmap-nodpi目录,用一套1080P素材可以解决大部分手机适配问题,不用每个资源目录下放一套素材
局限性:
宽高要固定,wrap_content属性某些场景下不起作用,目前发现这一个问题

代码处理:

ImageView iv= (ImageView) findViewById(R.id.test);BitmapFactory.Options options = new BitmapFactory.Options();//**这个属性很重要,是否支持缩放,false不支持缩放,就是图片按原比例展示**options.inScaled = false;//**设置图片比率,1是1/1、2是1/2、3是1/3,设置该参数会影响图片的质量** options.inSampleSize =1; //**使用RGB_565可以比系统默认RGB_888内存再减少1倍,会损失部分精度,测试看效果肉眼看不出来差距**options.inPreferredConfig = Bitmap.Config.RGB_565;Bitmap img =BitmapFactory.decodeResource(getResources(),R.drawable.hall_bg,options);iv.setImageBitmap(img);   Log.d("MainTest",""+img.getRowBytes()*img.getHeight()/(1024*1024));

代码处理,局限性:

适合单张大图片处理

更多相关文章

  1. Android6.0 ViewGroup/View 事件分发机制详解
  2. Android(安卓)图片对比(图片相似度)代码
  3. Android进阶练习 - 高效显示Bitmap(管理Bitmap内存)
  4. Android(安卓)TextView的drawLeft、drawRight..
  5. 【Android】避免图片等资源泄露在系统图库当中
  6. 安卓unit与instrumentation测试教程
  7. Android(安卓)quikboot
  8. Android知识点总结:Android选取、拍照与裁剪图片相关流程分析
  9. android图片压缩终极解决方案

随机推荐

  1. Android设备通过USB线连接PC进行Socket通
  2. Android平台值得关注的开源项目
  3. kotlin笔记 一
  4. ANDROID 中handler类的使用
  5. Android中通过Messenger与Service实现进
  6. android 7.0平台客制化虚拟导航按键(隐藏
  7. 浅谈Android事件分发机制
  8. android字符太长自动变成省略号
  9. View的基础知识
  10. Learning Android 第1章 - 工欲善其事,必