Android资源图片内存占用及优化
来源:互联网 发布:知乎 怎么搜文章 编辑:程序博客网 时间:2024/05/11 12:04
优化的两种方式:
1大背景图使用:9.png,使用9png不但能节省APK包容量,更能有效节省堆栈内存
2小技巧1:使用多分辨率图片设计[hdpi,mdpi,ldpi,xhdpi]。UI图片分别设计hdpi,mdpi,ldpi,xhdpi等多种规格,这也是官方推荐的方式,
使用这种方式,还有好处就是可以降低峰值内存,优先避免内存溢出。在android中图片的加载会根据分辨率来自动缩放【缩放的过程会额外消耗内存】
看看android图片的内部加载方式[ BitmapFactory.java]
Android 版本的一个inefficient:
private static Bitmap finishDecode(Bitmap bm, Rect outPadding, Options opts) {
//....
float scale = targetDensity / (float)density;
// TODO: This is very inefficient and should be done in native by Skia
final Bitmap oldBitmap = bm;
bm = Bitmap.createScaledBitmap(oldBitmap, (int) (bm.getWidth() * scale + 0.5f),
(int) (bm.getHeight() * scale + 0.5f), true);
oldBitmap.recycle();
//...
}
3小技巧2:图片资源放在assets或no-dpi中,也可以避免因缩放导致峰值内存过高
如果你的程序经常因加载某图片溢出,但又想继续使用的话,你也可以直接使用:
try{
//load big memory data
}catch(java.lang.OutOfMemoryError e){
//TODO 替代方案
}
测试:
1将图片A放置在no-dpi中,内存只会加载一次,不会进行任何缩放
2只在drawable-hdpi:下放置一张480-800的PNG图片A,
2.1当测试机为avd2.3.3-320-480-mdpi
2.1.1会先加载原始图片A到内存中【480-800】
2.1.2在原图片A【480-800】的基础上再创建一张经过缩小的图片B【此时占用双份内存】--导致内存溢出
2.1.3释放原图片A
如果在drawable-mdpi中再放置一张480-800的PNG图片A,则只会执行一次创建:图片A到内存中
2.2当测试机为AVD2.3.3-1024-600-mdpi
2.2.1会先加载原始图片A到内存中【480-800】
2.2.2在原图片A【480-800】的基础上再创建一张经过缩小的图片B【此时占用双份内存】--导致内存溢出
2.2.3释放原图片A
如果在drawable-mdpi中再放置一张480-800的PNG图片A,则只会执行一次创建:图片A到内存中
测试结论:
1图片是否会在创建的时候进行二次缩放只跟屏幕密度有关【与屏幕的尺寸无关】
2图片最后适应屏幕大小,会在BitmapDrawable中进行
BitmapDrawable对Bitmap的包装【内部会进行缩放】
if (mApplyGravity) {
Gravity.apply(state.mGravity, mBitmapWidth, mBitmapHeight,
getBounds(), mDstRect);
mApplyGravity = false;
}
canvas.drawBitmap(bitmap, null, mDstRect, state.mPaint);
2.3当测试机为AVD2.3.3-320-480-hdpi:
图片只加载一次
结论:
对于大图片在mdpi中/xhdpi/ldpi中放置类似图片
hdpi的图-->mdpi中需要:创建一次,再缩小一次【中间过程需要消耗更多内存】
hdpi的图-->xhdpi中需要:创建一次,再放大一次【中间过程需要消耗更多内存】
节省峰值内存的两种方式:www.2cto.com
1针对大尺寸图:分别设计hdpi,mdpi,xhdpi的资源图
2将大尺寸图放入:no-dpi中,这样只会创建一次
友盟后台-创建缩放图片的爆内存的异常[第2号内存杀手]
java.lang.OutOfMemoryError: bitmap size exceeds VM budget
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:477)
at android.graphics.Bitmap.createBitmap(Bitmap.java:444)
at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:349)
at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:498)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:473)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
at android.content.res.Resources.loadDrawable(Resources.java:1709)
at android.content.res.Resources.getDrawable(Resources.java:581)
at android.view.View.setBackgroundResource(View.java:7533)
0 0
- Android资源图片内存占用及优化
- Android资源图片内存占用及优化
- Android资源图片内存占用及优化
- Android资源图片内存占用及优化
- Android资源图片内存占用及优化
- Android资源图片内存占用及优化
- Android资源图片内存占用及优化
- Android资源图片内存占用及优化
- Android内存优化-图片资源
- 优化图片内存占用
- Android中应用程序drawable图片资源占用内存的统计
- Android中应用程序drawable图片资源占用内存的统计
- Android优化图片加载所占用的内存
- 关于Android应用内存占用查看及优化
- 火狐(Firefox)内存资源占用优化
- Android-内存优化-首页内存占用优化
- Android 一张图片(BitMap)占用内存的计算 图片内存优化
- Android 一张图片(BitMap)占用内存的计算 图片内存优化
- android .9.png ”点九” 图片制作方法
- 记录使用pgpool过程中的几个错误。
- Wubi安装Ubuntu 12.04
- LINUX KERNEL 記憶體管理機制之美
- 、做最好的自己--【我的2014】
- Android资源图片内存占用及优化
- Face The Right Way POJ 3276
- Linux添加硬盘 分区 格式化 挂载
- wireahsrk 解析 arp包 实例
- IOS sqlite 基础
- Fraction to Recurring Decimal|leetcode题解
- ffmpeg neon优化必看!!android下编译ffmpeg with neon的正确方法(已验证)
- 第5章 循环和关系表达式
- android官网打不开,这有代理站哦~