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

时间:2012-03-31 20:24:44

标签: java android out-of-memory dalvik

我正在开发一款关于android.Like塔防的游戏。 我正在使用表面视图。我使用一些图像作为位图。(Spritesheets,tilesets,buttons,backgrounds,efects vs.) 现在图像接近5-6 mb。当我运行我的游戏时,我得到了这个错误:

  

位图大小超过VM预算

     

19464192字节的外部分配对于此过程来说太大了。

我这样称呼图像

BitmapFactory.decodeResource(res, id)

我把它放到了数组中。 我无法缩放图像。我正在使用它们。 我试过了

options.inPurgeable=true;  

并且它工作但图像加载速度非常慢。我加载了spritesheet,当它加载时,我得到非常低的fps。

我该怎么办?

2 个答案:

答案 0 :(得分:2)

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

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

你的精灵表是巨大的,所以我认为你是正确的,你需要减少你的动画的大小。或者,从资源加载速度相当快,因此您可以放弃做一些事情,例如只为角色的当前方向加载动画条,并在他用新的动画条替换它时让他稍微停下来。但这可能会变得复杂。

此外,我强烈建议您在虚拟机堆设置为16mb的模拟器上测试您的应用,以确保您已解决所有设备的问题。 (模拟器通常默认为24mb,因此很容易进行未经测试并在发布后生成一些一星评价。)

答案 1 :(得分:0)

我不是游戏开发者,但我想我认识Android足够了。

加载大小的图像几乎肯定会抛出错误。为什么图像文件大小?

http://p-xr.com/android-tutorial-how-to-paint-animate-loop-and-remove-a-sprite/有一个例子。如果你注意到他的爆炸精灵只有~200Kb。即使是更详细的图像也不会占用更多的文件空间。

确定一些建议:

  • 您是否将所有的精灵表格加载到单张纸上或是 每个spritesheet在一个单独的文件?如果他们都在一个我会 将它们分开。

  • 降低图像的分辨率,Android设备是便携式的 而某些只有一个低分辨率的屏幕。例如HTC Wildfire的分辨率为240x320(LDPI设备)并且相当不错 常见设备。您尚未说明图像尺寸,因此我们无法确定这是否实用。

最后;我不是游戏程序员,但我发现本教程(同一系列的一部分)非常有启发性 - http://p-xr.com/android-tutorial-2d-canvas-graphics/。我想知道你是否应用了一个不适合Android的模式,但是没有代码我就不能说了。

对某些话题感兴趣,但值得注意的是......

人们估计了View的力量。虽然使用SurfaceView有一定的逻辑,但标准View本身会做很多事情。 SurfaceView通常需要运行底层线程(您必须自己设置)以使其工作。但是View会调用onDraw(),可以通过各种方式使用它,包括postinvalidate()方法(参见What does postInvalidate() do?)。

无论如何,可能值得查看本教程http://mindtherobot.com/blog/272/android-custom-ui-making-a-vintage-thermometer/。就个人而言,它是自定义视图的一个很好的例子,你可以用它们做些什么。我重写了几个部分并制作了一个怀表应用程序。