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

Naf*_*dır 6 java android out-of-memory dalvik

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

位图大小超过VM预算

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

我称这样的图像

BitmapFactory.decodeResource(res, id)
Run Code Online (Sandbox Code Playgroud)

我把它放到阵列.我无法缩放图像.我正在使用它们.我试过了

options.inPurgeable=true;  
Run Code Online (Sandbox Code Playgroud)

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

我能做什么?

Gra*_*ith 0

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

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

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

好的一些建议:

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

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

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

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

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

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