安卓:LibGDX 2D游戏内存消耗

8
我在使用libGDX开发2D游戏时遇到了一些内存消耗问题。
这是一个2D游戏,图形内容丰富 - 有许多纹理、动画、字体等。出于某种原因,所有图形内容都在游戏开始时加载 - 这里就有一个内存问题。我在不同的设备上测试了内存分配(本地和堆),得到了不同的结果:(我根据纹理大小将所有设备分为组)
Group 1(适用于~840 * 480屏幕的纹理) - HTC Desire(Froyo):178Mb(本地) - 12Mb(堆) - 应用程序加载成功 - HTC One V(ICS):30Mb(本地) - 12Mb(堆) - 应用程序加载成功 - HTC Desire S(Jelly Bean):30Mb(本地) - 12Mb(堆) - 应用程序加载成功
Group 2(适用于~1366 * 768屏幕的纹理) - Samsung(Google)Galaxy Nexus:329Mb(本地) - 18Mb(堆) - 完美运行 - Galaxy TAB(蜂巢):164Mb(本地) - 10Mb(堆) - 应用程序崩溃(Surface.OutOfResouresException)。
我认为在所有Android版本上可能存在一些重要的内存管理差异,这给我带来了麻烦。
有人能解释一下在Android 3.x上加载纹理时到底发生了什么吗?或者可以发布一些链接以了解需要做什么来解决此问题。
我进行了一些额外的测试,包括在3.x模拟器上运行游戏(我知道这不是最好的方法,但日志与之前的模拟器和Galaxy Tab类似)
最终,我使用逐步加载资源并加入一些进度条来解决了这种情况。经过所有尝试,我没有找到其他方法。
2个回答

3
如果您想知道为什么Android 3比2.X版本更容易崩溃,那是因为存在ByteBuffer的一个bug。ByteBuffer使用了4倍的内存,所以您需要针对Android 3使用低分辨率图像。这个问题在Android 4中已经得到解决。幸运的是,在Android 3及以上版本中,您可以使用大堆选项(提供约128兆字节)来解决此问题,这也是我们应用程序必须启用的选项。 http://code.google.com/p/android/issues/detail?id=16941

谢谢你的回答,我很惊讶在这个小资源平台上发现了如此严重的错误。谷歌让我失望了 :( 我尝试在清单文件中使用了largeHeap选项 - 它将堆大小增加到280Mb,但没有任何效果。 - Viacheslav
确实是一个严重的错误。幸运的是,当涉及到平板电脑时,每个人都在转向Android 4,而Android 3的市场份额很小。但正如我之前所说,当涉及到Android 3时,您将不得不降低图像分辨率。 - Daniel Ryan
相同的 bug 在搭载 Android 4.0.3 的 Acer Iconia Tab 上出现。 - Viacheslav
这可能不是我说的那个已在4.0中修复的错误。尽量避免内存崩溃是一个很难的问题,我现在正在尝试修复一个带有此类问题的应用程序。也许Acer Iconia Tab的largeHeap并不是那么大?你可能需要进行一些调试。我建议在设备崩溃之前转储设备的内存,并使用eclipse插件Memory Analysis。然后你就知道究竟是什么在使用你的内存了。 - Daniel Ryan

1

我认为如果位图的格式与显示器的格式不匹配(系统最终会创建一个具有正确格式的副本进行传输),则位图的运行时内存使用量可能会膨胀。我认为这在旧版Android系统上更成问题,可能不是您在3.0上看到的问题,但值得研究。(请参见Romain在此处发布的性能部分

位图底层字节数组的内存计算在3.0(Honeycomb)中发生了变化,内存从本地端移动到Java堆。然而,这只是将内存移动了一下,并不应该影响实际限制(本地内存仍然针对相同的限制进行计算,只是某些工具看不到它)。

堆限制在不同设备上也不同。(请参见不同手机/设备和操作系统版本上的Android堆大小

这个Google I/O演讲涵盖了一堆关于3.0中内存管理变化的问题,可能会很有用:http://dubroy.com/blog/google-io-memory-management-for-android-apps/

您可以在低内存设备上加载缩小版本的位图。阅读http://developer.android.com/training/displaying-bitmaps/index.html的其余部分也可能是值得的。

您的应用程序有多少磁盘图像数据?您正在加载多大的其他非图像数据(字体、动画等)?


感谢您的回答,通过您提供的链接,我找到了许多有趣和有用的信息。关于磁盘数据大小很难说,但我认为3.x平板电脑的纹理大约为15-20Mb,字体为0.25Mb,声音和音乐为2.5Mb。 - Viacheslav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接