Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 奇怪的VM预算超出错误_Android_Memory - Fatal编程技术网

Android 奇怪的VM预算超出错误

Android 奇怪的VM预算超出错误,android,memory,Android,Memory,我正在制作一个游戏,它使用了很多位图作为图像,并且在任何给定的时间都需要它们。当游戏开始时,我做的第一件事就是解码所有的图像。最近,我一直收到可怕的“位图超过VM预算”错误,但我不明白为什么我会收到它,原因如下: 正在使用的图像文件总共约为3.5MB,我相信这不会是一个问题 尽管代码几乎没有更改,但错误还是来了又去。将代码还原回未发生错误时仍然会发生错误 尽管尝试减少内存使用,包括此处提到的BitmapFactory.Options.inSampleSize等,LogCat仍在同一行代码中显示错

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

  • 正在使用的图像文件总共约为3.5MB,我相信这不会是一个问题

  • 尽管代码几乎没有更改,但错误还是来了又去。将代码还原回未发生错误时仍然会发生错误

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

  • 有人知道为什么会发生这种情况吗?如果必须,下面是我正在做的示例代码:

    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.
    }
    

    可能有些位图正在一次又一次地重新创建,而没有被回收()。Android有大约20-25个位图虚拟机

  • 正在使用的图像文件总数约为3.5 MB,这 我相信这不应该是个问题

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

    示例:我的SD卡上的随机照片在磁盘上以1552x2592分辨率压缩为JPEG格式,有1010 kB,但未压缩时需要
    (1552*2592*4)
    字节,约为15 MB

    有办法绕过这个限制吗?
    基本上答案是:视情况而定。在Java中,没有。您有这个固定的限制(如果我没记错的话,在某些设备上可以降到16MB)。在这里,您所能做的就是测试在给定时间点您真正需要的图像,并只加载这些图像以尽可能保持内存可用。您还可以使用NDK加载图片并通过JNI从java引用它们。这些限制不适用于本机代码中分配的内存。但我不能告诉你更多,我自己从来没有做过。你必须用一些C来做这个

    3.5MB听起来像是磁盘上的压缩文件。当您将它们加载到内存中时,它们将被解压缩,并根据像素数占用空间。如果在内部使用
    ARGB_8888
    作为图像格式(默认为
    BitmapFactory
    ),则每个像素占用4个字节。示例:我SD卡上的随机照片在磁盘上有1010 kB,以1552x2592压缩为jpeg格式,但未压缩时应该需要(1552*2592*4)字节,约为15 MB。有没有……有什么办法解决这个问题?基本上答案是:视情况而定。在Java中,没有。您有这个固定的限制(如果我没记错的话,在某些设备上可以降到16MB)。在这里,您所能做的就是测试在给定时间点您真正需要的图像,并只加载这些图像以尽可能保持内存可用。您还可以使用NDK加载图片并通过JNI从java引用它们。这些限制不适用于本机代码中分配的内存。但我不能告诉你更多,我自己从来没有做过。你必须用一些C来做这个。试试谷歌搜索。alextsc,你基本上回答了我的问题,但我不能接受评论作为答案。发布并重新格式化了一点。:)