打印出相关信息:
图中显示了从资源文件中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