【问题标题】:How much memory does a bitmap cost when in different drawable folder位图在不同的可绘制文件夹中需要多少内存
【发布时间】:2015-07-27 14:07:52
【问题描述】:

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

【问题讨论】:

  • 这取决于图像的大小,显然您希望 xhdpi 文件夹中的图像比 hdpi 文件夹中的图像更大,以便在更高的屏幕分辨率下看起来更好。否则你只会得到一个放大的模糊图像

标签: android memory bitmap


【解决方案1】:

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

首先它取决于设置为位图的配置。你可以计算一下:

/**
 * 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 等。概念。

假设您有一个小屏幕。 320x240像素
通常,具有此屏幕分辨率的设备内存也较低。所以你需要明白 - 小屏幕上的大图片是 OutOfMemoryError 的正确方法。

【讨论】:

    【解决方案2】:

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

    1. 设备有什么屏幕(ldpimdpixxxhdpi等)
    2. 您提供了哪些分辨率(尺寸同上)

    如果你有一个 ldpi 设备,并且你只提供一个 xxxhdpi 资源,android 只会在记忆。

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

    但是,如果您将 drawable 作为位图加载(而不是像 setBackground() 这样的原生方法),它将在内存中加载完整的图像,而不是缩小版本。那会毁了你的记忆。

    此外,缩小和放大可能会导致伪影,因此这是使用多个可绘制对象的另一个原因。

    规则?如果您的目标是低端设备,请确保始终提供目标密度可绘制对象。

    阅读excellent article,了解 Android 中位图的内存管理。

    【讨论】:

      猜你喜欢
      • 2018-04-29
      • 2014-09-07
      • 2011-11-06
      • 2022-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多