Java 游戏开发时位图大小超过VM预算

Java 游戏开发时位图大小超过VM预算,java,android,out-of-memory,dalvik,Java,Android,Out Of Memory,Dalvik,我正在android上开发一个游戏,比如塔防。 我正在使用表面视图。我正在使用一些图像作为位图。(精灵表、瓷砖集、按钮、背景、效果vs。) 现在图像的大小接近5-6MB。我在运行游戏时出现以下错误: 位图大小超出VM预算 19464192字节的外部分配对此进程太大 我称之为这样的图像 BitmapFactory.decodeResource(res, id) 我把它放到数组里。 我无法缩放图像。我正在使用所有图像。 我试过了 options.inPurgeable=true; 它可以工作

我正在android上开发一个游戏,比如塔防。 我正在使用表面视图。我正在使用一些图像作为位图。(精灵表、瓷砖集、按钮、背景、效果vs。) 现在图像的大小接近5-6MB。我在运行游戏时出现以下错误:

位图大小超出VM预算

19464192字节的外部分配对此进程太大

我称之为这样的图像

BitmapFactory.decodeResource(res, id)
我把它放到数组里。 我无法缩放图像。我正在使用所有图像。 我试过了

options.inPurgeable=true;  
它可以工作,但是图像加载速度非常慢。我加载了一张带有它的精灵纸,当它加载时,我得到了非常低的fps


我能做什么?

我不是游戏开发人员,但我想我对安卓系统了解得足够多

加载大小相同的图像几乎肯定会出错。为什么图像的文件大小如此之大

这里有一个例子。如果你注意到他有一个只有~200Kb的爆炸精灵。即使是更详细的图像也不会占用更多的文件空间

好的,一些建议:

  • 您是将所有SpriteSheet加载到一张纸上还是 每个精灵表都在一个单独的文件中?如果他们都在一起,我会的 把他们分开

  • 降低图像的分辨率,Android设备是便携式的 有些只有低分辨率的屏幕。比如HTC Wildfire的分辨率为240x320(LDPI设备),是一款相当不错的产品 普通设备。您尚未说明图像尺寸,因此我们无法确定这是否可行

最后,;我不是一个游戏程序员,但我发现这个教程(同一系列的一部分)非常有启发性-。我想知道你是否正在应用一种不适合Android的模式,但是如果没有代码我就说不出来

纠正一些有点离题但值得注意的事情…

人们低估了这种观点的力量。虽然使用SurfaceView有一定的逻辑性,但标准视图本身可以做很多事情。SurfaceView通常需要运行一个底层线程(您必须自己设置)才能使其工作。然而,视图调用onDraw(),它可以以多种方式使用,包括
postinvalidate()
方法(请参阅)


在任何情况下,都值得查看本教程。就个人而言,这是一个很好的自定义视图示例,以及您可以使用它们做什么。我重写了一些章节,制作了一个怀表应用程序。

我也有这个问题;除了减少一次加载的位图的数量/大小之外,没有其他解决方案。一些较旧的Android设备只为整个应用程序的堆分配16MB,并且位图在加载后会以未压缩的方式存储在内存中,因此在大背景等情况下不难超过16MB(854x480,32位位图约为1.6MB未压缩)

在我的游戏中,我可以通过只加载我将在当前级别中使用的位图来绕过它(例如,我有一个单独的位图对象作为背景,每次它更改时都会从资源中重新加载,而不是在内存中维护多个位图。我只维护一个int来跟踪我当前加载的资源。)

你的精灵表是巨大的,所以我认为你是对的,你需要减少你的动画大小。或者,从资源加载速度相当快,因此您可能可以不必执行某些操作,例如仅加载角色当前方向的动画条,并在他转向时让他稍微暂停,而您可以使用新的动画条替换它。但这可能会变得复杂


另外,我强烈建议在模拟器上测试应用程序,将VM堆设置为16mb,以确保已修复所有设备的问题。(emulator通常默认为24mb,因此很容易未经测试,并在发布后生成一些1星评论。)

感谢您的帮助,但我无法解决。我使用大精灵表是因为有太多的动画。例如,这是我游戏中一个生物的精灵表:我使用galaxy s,我使用的是全尺寸的精灵表。首先,我必须在我的设备上使用它。可能位图有7-8 mb的限制。我再次研究,发现要解决这个问题,我必须使用jni或opengl。但这一点,我不能使用它们。可能是其他项目。所以我将删除一些动画并进行堆管理。