Android 奇怪的VM预算超出错误
我正在制作一个游戏,它使用了很多位图作为图像,并且在任何给定的时间都需要它们。当游戏开始时,我做的第一件事就是解码所有的图像。最近,我一直收到可怕的“位图超过VM预算”错误,但我不明白为什么我会收到它,原因如下:Android 奇怪的VM预算超出错误,android,memory,Android,Memory,我正在制作一个游戏,它使用了很多位图作为图像,并且在任何给定的时间都需要它们。当游戏开始时,我做的第一件事就是解码所有的图像。最近,我一直收到可怕的“位图超过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.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,你基本上回答了我的问题,但我不能接受评论作为答案。发布并重新格式化了一点。:)