Android中Bitmap内存优化,耗时两个礼拜8000字Android面试长文

本文探讨了Android中Bitmap内存优化的重要性,通过分析Bitmap的decode过程,揭示了内存占用与图片尺寸、设备分辨率的关系。介绍了BitmapFactory.Options参数在控制内存使用中的作用,并提出了三种优化方式:低色彩解析模式、资源文件合理放置、图片尺寸调整。同时,展示了通过缩放比例控制内存占用的实践案例。最后,提到了Android不同版本中Bitmap内存模型的变化。
摘要由CSDN通过智能技术生成

打印出相关信息:

图中显示了从资源文件中decode得到的bitmap的长、宽和占用内存大小(byte)等信息。

首先,从数据上可以验证:

17280000 = 2400 * 1800 * 4

这意味着,为了将单张800 * 600 的图片加载到内存当中,付出了近17.28M的代价,即使现在手机运存普遍上涨,这样的开销也是无法接受的,因此,对于Bitmap的使用,是需要非常小心的。好在,目前主流的图像加载库(Glide、Fresco等)基本上都不在需要开发者去关心Bitmap内存占用问题。

先暂时回到Bitmap占用内存的计算上来,对比之前定义的公式和源图片的尺寸数据,我们会发现,这张800 * 600大小的图片,decode到内存中的Bitmap的横纵像素数量实际是:2400 * 1800,相当于缩放了3倍大小。为了探究这缩放来自何处,我们开始跟踪源码:之前提到过,Bitmap的decode过程实际上是在native层完成的,为此,需要从BitmapFactory.cpp#nativeDecodeXXX方法开始跟踪,这里省略其他decode代码,直接贴出和缩放相关的代码如下:

if (env->GetBooleanField(options, gOptions_scaledFieldID)) {

const int density = env->GetIntField(options, gOptions_densityFieldID);

const int targetDensity = env->GetIntField(options, gOptions_targetDensityFieldID);

const int screenDensity = env->GetIntField(options, gOptions_screenDensityFieldID);

if (density != 0 && targetDensity != 0 && density != screenDensity) {

scale = (float) targetDensity / density;

}

}

int scaledWidth = decoded->width();

int scaledHeight = decoded->height();

if (willScale && mode != SkImageDecoder::kDecodeBounds_Mode) {

scaledWidth = int(scaledWidth * scale + 0.5f);

scaledHeight = int(scaledHeight * scale + 0.5f);

}

if (will

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值