【问题标题】:How to work with a lot of bitmaps and avoid the error: "bitmap size exceeds VM budget"? [duplicate]如何处理大量位图并避免错误:“位图大小超出 VM 预算”? [复制]
【发布时间】:2012-02-28 14:50:03
【问题描述】:

可能重复:
Android: Strange out of memory issue

我正在尝试使用四个 1024 x 1024 的位图,我需要在内存中有四个,因为我正在创建一个必须在横向模式下显示四个可缩放位图的画廊。

它在 Motorola Droid 2.2.3 上运行,但在 Galaxy spica (2.1) 上运行失败。这是我在 spica 上遇到的例外情况:

02-28 15:45:25.963: ERROR/dalvikvm-heap(17109): 4194304-byte external allocation too large for this process.
02-28 15:45:25.968: ERROR/(17109): VM won't let us allocate 4194304 bytes
02-28 15:45:25.973: DEBUG/AndroidRuntime(17109): Shutting down VM
02-28 15:45:25.973: WARN/dalvikvm(17109): threadid=3: thread exiting with uncaught exception (group=0x4001b180)
02-28 15:45:25.973: ERROR/AndroidRuntime(17109): Uncaught handler: thread main exiting due to uncaught exception
02-28 15:45:25.988: ERROR/AndroidRuntime(17109): java.lang.OutOfMemoryError: bitmap size exceeds VM budget

如何解决?

谢谢

【问题讨论】:

标签: android


【解决方案1】:

没有简单的方法可以解决这个问题 - 单个应用程序的内存预算非常低,因此无法在内存中保留 16MB。您可以使用 OpenGL(纹理不包含在该预算中),或者一次只使用一个位图(或使用较小的位图)。

【讨论】:

  • 它不是 16MB,而是 4MB,是的,我正在使用 OPENGL,并且我正在使用我正在使用的所有位图
  • 1024px*1024px*4B*4 位图 = 16MB - 尝试分配其中一个时会出错。通常 16MB 是单个应用程序的总内存预算。 OpenGL 纹理有单独的预算。
【解决方案2】:

您可以使用 RGB_565 与默认的 ARGB_8888 将大小减半。

  • ARGB_8888 每个像素需要 4 个字节:4*1024*1024 = 4194304 (4mb)

  • RGB_565 需要每个像素 2 个字节:2*1024*1024 = 2097152 (2mb)

您可以使用BitmapFactory 的选项进行设置。见inPreferredConfig

但是即使这样,您仍然会遇到困难。为什么不把图像的尺寸也缩小呢?我怀疑您是否能够显示 1024x1024 图像。

【讨论】:

    猜你喜欢
    • 2012-08-19
    • 2012-08-09
    • 2012-05-31
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多