奇怪的VM预算超出错误

时间:2011-09-10 02:50:00

标签: android memory

我正在制作一个使用大量位图的游戏,并且在任何给定时间都需要它们。当游戏开始时,我做的第一件事就是解码所有图像。到目前为止,我已经得到了可怕的“位图超过VM预算”错误,但我不明白为什么我得到它的原因如下:

  1. 正在使用的图像文件总共大约3.5 MB,我认为这应该不是问题。

  2. 即使代码几乎没有改变,错误也已经过去了。将代码还原为未发生错误时仍会发生错误。

  3. 尽管尝试减少内存使用量,包括像BitmapFactory.Options.inSampleSize这样提到的内存使用量,但LogCat仍显示出现在同一行代码中的错误。这行代码是另一个图像解码就像所有其他图像一样。

  4. 任何人都有任何关于为什么会发生这种情况的想法?如果必须,下面是我正在做的示例代码:

    public GameThread(SurfaceHolder sHolder, Context context, Handler handler)
    {
        background = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
        // Code repeated for other images, crashing at one of them towards the end.
    }
    

2 个答案:

答案 0 :(得分:0)

可能一些Bitmaps正在被反复重建而不是回收()。 Android有~20-25 Bitmap VM。

答案 1 :(得分:0)

  
      
  1. 正在使用的图像文件总共大约3.5 MB,其中   我认为应该不是问题。
  2.   

3.5 MB听起来像磁盘上的压缩文件。当您将它们加载到内存中时,它们将被解压缩并根据像素数占用空间。如果在内部使用ARGB_8888作为图像格式(BitmapFactory的默认值),则每个像素占用4个字节。

示例:我的SD卡中的随机照片在磁盘上的1010 kB压缩成JPEG,分辨率为1552x2592,但未压缩它应该占用(1552*2592*4)个字节,大约15 MB

有没有办法解决这个限制?

基本上答案是:取决于。在Java中,没有。你有这个固定的限制(如果我没记错的话,在某些设备上最低可达16 MB)。你在这里所能做的就是测试你在给定时间点确实需要哪些图像,并且只加载这些图像以尽可能地保持内存空闲。您还可以使用NDK加载图片并通过JNI从java引用它们。限制不适用于本机代码中分配的内存。但我不能告诉你更多,从来没有这样做过。你必须为此使用一些C.