【问题标题】:Is decreasing size of .png files have some effect to resulted Bitmap in memory减小 .png 文件的大小对内存中的位图有一些影响
【发布时间】:2011-02-05 20:00:46
【问题描述】:

我正在用大量 PNG 图片编写游戏。一切正常。比我用WebView 添加新活动并得到内存不足。在那之后,我做了一些实验——将游戏 PNG 图像替换为完全填充了某种颜色的图像。结果内存不足已经消失了。

但我认为Bitmap 在内部单独保存每个像素,因此此类更改应该没有效果。也许这是因为初始图像有 alpha 通道而我的测试图像没有?

但实际上的问题是:减小 PNG 图像文件的大小是否会对减少 VM 应用程序堆的使用产生一些影响?

【问题讨论】:

    标签: android png bitmap


    【解决方案1】:

    您应该查看将图像解码成的位图配置。我不知道具体的配置文件是什么意思,但例如,你可以解码成 ARGB_8888 或简单的 RGB_565。 RGB_565 使用较少的内存,大概是因为它没有 alpha(透明度)通道并且每种颜色使用较少的位。在您的情况下,可能发生的是简单图像被解码为 RGB_565,而更复杂的图像被解码为 ARGB_8888。

    更改正在使用的配置的方法是在图像文件的解码过程中,如下所示:

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inPreferredConfig = Bitmap.Config.RGB_565;
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon, options);
    

    对此进行实验,看看是否有帮助。这样做无疑对我的游戏有所帮助。

    【讨论】:

    • 是的,当我进行测试时,我使用了不带选项的 BitmapFactory.decodeResource(),因此一张彩色图像可以解码为 RGB_565,而我的游戏图像可以解码为 ARGB_8888。我以前没有考虑过这个,但是今天当我上班时,我使用一个选项 ARGB_8888 进行第二次测试,看看会发生什么。不幸的是,我几乎所有游戏的图像都需要透明度,所以我不能只使用 RGB_565,现在我使用 ARGB_4444
    • .png 文件的大小似乎对内存中的位图有影响。也许下周我会进行更深入的调查
    【解决方案2】:

    无论是不是 Android,内存中的位图都不会被压缩,因此它们将采用(每像素位数)* 宽度 * 高度,根据像素格式会有一些变化。

    我不知道如何绘制 PNG 的细节,但可能正在发生的事情是更简单的 PNG 需要更少的内存来解码。

    【讨论】:

      【解决方案3】:

      Android 中 Bitmap 对象的内存使用与图像分辨率有关,与原始格式(jpg、png 等)或文件大小无关。它需要大约 3 字节 pr 像素(1 字节 pr 颜色通道)。

      无论如何,如果您使用 BitmapFactory 解码图像,则在解码输入流时,较小的源文件需要较少的内存。

      您可以使用 Dalvik 调试器 (ddms) 自行测试。 转到 Sysinfo 选项卡,然后从下拉列表中选择内存使用情况。您将看到您的应用程序使用了多少内存。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-16
        • 2019-07-27
        • 2017-01-25
        • 1970-01-01
        • 2012-03-26
        • 2012-11-04
        • 2013-11-19
        相关资源
        最近更新 更多