我正在制作一个使用大量位图的游戏,并且在任何给定时间都需要它们。当游戏开始时,我做的第一件事就是解码所有图像。到目前为止,我已经得到了可怕的“位图超过VM预算”错误,但我不明白为什么我得到它的原因如下:
正在使用的图像文件总共大约3.5 MB,我认为这应该不是问题。
即使代码几乎没有改变,错误也已经过去了。将代码还原为未发生错误时仍会发生错误。
尽管尝试减少内存使用量,包括像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.
}
答案 0 :(得分:0)
可能一些Bitmaps正在被反复重建而不是回收()。 Android有~20-25 Bitmap VM。
答案 1 :(得分:0)
- 正在使用的图像文件总共大约3.5 MB,其中 我认为应该不是问题。
醇>
3.5 MB听起来像磁盘上的压缩文件。当您将它们加载到内存中时,它们将被解压缩并根据像素数占用空间。如果在内部使用ARGB_8888
作为图像格式(BitmapFactory
的默认值),则每个像素占用4个字节。
示例:我的SD卡中的随机照片在磁盘上的1010 kB压缩成JPEG,分辨率为1552x2592,但未压缩它应该占用(1552*2592*4)
个字节,大约15 MB
基本上答案是:取决于。在Java中,没有。你有这个固定的限制(如果我没记错的话,在某些设备上最低可达16 MB)。你在这里所能做的就是测试你在给定时间点确实需要哪些图像,并且只加载这些图像以尽可能地保持内存空闲。您还可以使用NDK加载图片并通过JNI从java引用它们。限制不适用于本机代码中分配的内存。但我不能告诉你更多,从来没有这样做过。你必须为此使用一些C.