我正在开发一款关于android.Like塔防的游戏。 我正在使用表面视图。我使用一些图像作为位图。(Spritesheets,tilesets,buttons,backgrounds,efects vs.) 现在图像接近5-6 mb。当我运行我的游戏时,我得到了这个错误:
位图大小超过VM预算
19464192字节的外部分配对于此过程来说太大了。
我这样称呼图像
BitmapFactory.decodeResource(res, id)
我把它放到了数组中。 我无法缩放图像。我正在使用它们。 我试过了
options.inPurgeable=true;
并且它工作但图像加载速度非常慢。我加载了spritesheet,当它加载时,我得到非常低的fps。
我该怎么办?
答案 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/。就个人而言,它是自定义视图的一个很好的例子,你可以用它们做些什么。我重写了几个部分并制作了一个怀表应用程序。