【问题标题】:Bitmap size exceeds VM budget when game development游戏开发时位图大小超出虚拟机预算
【发布时间】:2012-03-31 20:24:43
【问题描述】:

我正在 android.Like 塔防上开发游戏。 我正在使用表面视图。我正在使用一些图像作为位图。(Spritesheets,tilesets,按钮,背景,效果与) 现在图像接近 5-6 mb。运行游戏时出现此错误:

位图大小超出虚拟机预算

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

我这样称呼图像

BitmapFactory.decodeResource(res, id)

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

options.inPurgeable=true;  

它可以工作,但图像加载非常缓慢。我用它加载了一个精灵表,当它加载时,我的 fps 非常低。

我能做什么?

【问题讨论】:

    标签: java android out-of-memory dalvik


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      我不是游戏开发者,但我想我对 Android 的了解已经足够了。

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

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

      好的一些建议:

      • 您是要将所有您的 spritesheets 加载到单个工作表上还是 每个精灵表在一个单独的文件中?如果他们都在一个我会 把它们分开。

      • 降低图像的分辨率,Android 设备是便携式的 一些只有低分辨率的屏幕。例如 HTC Wildfire 的分辨率为 240x320(LDPI 设备),非常适合 通用设备。您没有说明图片尺寸,因此我们无法确定这是否实用。

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

      正确的东西有点离题但值得注意...

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

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

      【讨论】:

      • 感谢您的帮助,但我无法解决。我使用大精灵表是因为动画太多。例如,这是我游戏中的一个生物精灵表:nafiz.in/bigeye.png 我使用星系,我正在使用这个精灵表全尺寸。首先我必须在我的设备上使用它。可能,位图有 7-8 mb 的限制。我再次研究,我发现要解决这个问题,我必须使用 jni 或 opengl。但那一点,我不能使用它们。也许其他项目。所以我会删除一些动画和堆管理工作。
      猜你喜欢
      • 2011-10-29
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 2011-08-23
      相关资源
      最近更新 更多