Android 如何在游戏中使用大量位图而不超过VM内存预算?

Android 如何在游戏中使用大量位图而不超过VM内存预算?,android,animation,bitmap,Android,Animation,Bitmap,在我的游戏中,我有12个不同的动画,每个动画由10个位图组成,每个位图是200x150像素。每次用户触摸屏幕(虚拟游戏板)时,将播放其中一个动画。通常这是一项简单的工作,但就性能而言,我遇到了麻烦。由于虚拟机内存预算问题,从游戏开始将所有位图加载到阵列会导致游戏崩溃。看来 我的另一个选择是每次需要时重新创建位图,然后重新设置它们的样式,但这可能会由于创建时间和垃圾收集而导致延迟。我想不出第三种选择,所以我问你。有没有内存效率高的选项?< P> > P>我会考虑使用SpReSeSeGET。Spri

在我的游戏中,我有12个不同的动画,每个动画由10个位图组成,每个位图是200x150像素。每次用户触摸屏幕(虚拟游戏板)时,将播放其中一个动画。通常这是一项简单的工作,但就性能而言,我遇到了麻烦。由于虚拟机内存预算问题,从游戏开始将所有位图加载到阵列会导致游戏崩溃。看来
我的另一个选择是每次需要时重新创建位图,然后重新设置它们的样式,但这可能会由于创建时间和垃圾收集而导致延迟。我想不出第三种选择,所以我问你。有没有内存效率高的选项?< P> > P>我会考虑使用SpReSeSeGET。SpriteSheet将在一个位图上包含动画的所有帧,然后您可以通过编程加载正确的帧坐标来创建动画。

这是动画的14MB内存,这对于VM堆来说可能是一个很大的空间,它应该很好地适合图形卡内存。我假设您正在使用OpenGL(如果不是的话,您几乎不得不这样做)。在这种情况下,您可以一个接一个地构建帧,将它们绑定到纹理,然后从VM的内存中释放它们。这将是相当快,但我不会经常这样做,或提供某种加载功能,如果滞后大于1/2秒左右

您应该将位图格式(如果可以的话)降低到类似rgb565甚至palette256的程度,或者在播放时加载动画。@fazo:他的图像的分辨率似乎合理(即使对于移动设备),但由于图像质量的原因,我不敢推荐16位颜色,它只会减少50%所需的空间。Palette256的质量甚至更有限,但确实大大减小了大小。16位非常流行,而且质量不会降低很多(特别是在适当抖动的情况下)。我们也不知道这些动画是什么样子的,所以很难提出任何建议。谢谢你的回答。我没有使用OpenGL。因为我的游戏是2d的,只玩一些动画,所以我觉得surfaceview可以。很明显,我对游戏编程还不熟悉,所以你能解释一下为什么我几乎要使用OpenGL吗?原因有很多,但正如你所发现的,堆内存就是其中之一。另一个问题是,以高于20帧/秒的速度渲染图形所需的CPU压力非常高(尤其是动画)。OpenGL不仅仅适用于3D图形,它还适用于所有高性能图形。即使是像Hexaddicus()这样简单的游戏,我所做的一个简单的2D游戏,也需要OpenGL来获得所需的性能。你的游戏看起来很不错,我几分钟后再试。再次感谢。@AndrewWhite你的链接对我不起作用。我想这就是游戏:@Pius确实,那是链接;SharperMindsTech已不复存在,但该应用程序仍在运行。很遗憾,我无法编辑评论。