在不同的drawable文件夹中,位图花费了多少内存

时间:2015-07-27 14:07:53

标签: android memory bitmap

我已经被这个问题困扰了一段时间了 谷歌搜索后没有找到太多有用的信息,我来到这里寻求帮助 假设我有一个图像(分辨率100px * 100px),然后将其设置为ImageView(w * h 100dp * 100dp)。
如果设备类型是hdpi,当我将图像放入drawable,drawable-hdpi,drawable-mdpi,drawable-xhdpi,drawable-nohpi文件夹时,会花多少内存? 我们可以依靠一条规则来获得结果吗? 多谢你们。

2 个答案:

答案 0 :(得分:2)

Drawable类是所有类图形的基类。这是画布Canvas上主题的一般抽象。所以你可以从中创建Bitmap。

首先,它取决于配置设置为位图。你可以计算出来:

/**
 * A helper function to return the byte usage per pixel of a bitmap based on its configuration.
 */
static int getBytesPerPixel(Config config) {
    if (config == Config.ARGB_8888) {
        return 4;
    } else if (config == Config.RGB_565) {
        return 2;
    } else if (config == Config.ARGB_4444) {
        return 2;
    } else if (config == Config.ALPHA_8) {
        return 1;
    }
    return 1;
}

因此,您可以计算将为此对象分配的字节数:

getPixels (int[] pixels, int offset, int stride, int x, int y, int width, int height)

int count = pixels.length;
long allBytes = getBytesPerPixel(config)*count; // your memory allocation

二次。你需要了解一个hdpi,xhdpi,mdpi等。概念

假设你有一个小屏幕。 320x240px
通常,具有此屏幕分辨率的设备也具有低内存。所以你需要理解 - 小屏幕上的大图是OutOfMemoryError的正确方法。

答案 1 :(得分:1)

消耗的资源量取决于两件事:

  1. 设备有哪些屏幕( ldpi mdpi xxxhdpi 等)
  2. 您提供的解决方案(与上述尺寸相同)
  3. 如果你有一个 ldpi 设备,而你只提供一个 xxxhdpi 资源,android只会保留一个缩小的( subsampled )位图存储器中。

    这是什么意思?这意味着,android在内存中加载最接近的更高密度资源(如果可用)并使用它。因此,如果您没有提供靠近设备的密度,那么您将浪费CPU (缩小位图,这是一项非常昂贵的操作)。 Android足够好,只会在内存中保留所需的大小

    但是,如果您将drawable加载为位图(而不是像setBackground()这样的本机方法),它将加载整个图像,在内存中,而不是缩小版本。这会炸掉你的记忆。

    此外,缩小和扩展可能会导致工件产生伪影,因此这也是获得多个drawable的另一个原因。

    <强>规则?如果您要定位低端设备,请确保始终提供目标密度可绘制内容。

    在Android内的位图内存管理中阅读此excellent article