2012-03-17 37 views
1

我制作了一个自上而下的游戏,角色在一个关卡中移动。水平基本上是一个1600x2400 png。我无法将该png加载到内存中,所以我必须使用BitmapRegionDecoder在玩家在关卡中移动时将其加载到区块中。当然这很糟糕,可能导致口吃。我想在后台线程中加载下一个块,但这意味着我在内存中有两个块:当前块和下一个块,这会导致OutOfMemoryException异常。为什么android将vm内存大小限制为任意24或32 MB?

现在所有的设备至少有512 MB或RAM,为什么我们仍然对vm ram有那么愚蠢的限制?谷歌专心告诉我们应该使用多少内存!让我们来决定!现在我不得不吃更多的CPU周期,因为我不能将所有东西加载到RAM中,更不用说我使用此BitmapRegionDecoder获得的更糟糕的性能!

任何想法为什么谷歌这样做,什么时候会结束?这个决定背后的逻辑论据是什么?

回答

2

a)512MB RAM并不意味着您的应用程序可以使用那么多。可用内存仍然非常有限。所以我想它永远不会结束。虚拟机获得的数量可能会增加,但如果你想保持兼容,那么你必须有效地进行编码。 (例如分割图像,不从一个巨大的图像加载数据)

b)您可以使用JNI/NDK/C并自己管理内存,本地代码没有限制。

+0

我想关于分割图像的想法并不是那么好。这是由于不同设备的屏幕分辨率不同所致。我非常肯定,作者试图让游戏在不同设备上看起来很相似,这意味着如果设备的屏幕分辨率比用户看到的更多,而不是拉伸和模糊的小块。因此,它是一个真正的困境,解码区域,并获得内存不足或分割,并在某些情况下获得低质量的产品。而这款AOS虚拟机的内存限制真的很糟糕! – Stan 2013-07-08 07:00:45

+0

如果你有任意大的图像,例如谷歌地图,将图片拆分成图块是一个好主意。你显然需要做更多的事情来显示它,就好像它是一个图像一样,但你获得了图像大小的完全独立性。你可以从这个例子看出,如果你做得对,你没有模糊的图像。这只是加载单个图像不容易。 – zapl 2013-07-08 12:48:23

+0

同意,我记住这一点,我的意思是还有很多工作要做。另一方面还有很多工作要做==更多的机会得到滞后/口吃等。 – Stan 2013-07-08 14:47:30

相关问题