Android:LibGDX 2D游戏内存消耗

Posted

技术标签:

【中文标题】Android:LibGDX 2D游戏内存消耗【英文标题】:Android: LibGDX 2D game memory consumption 【发布时间】:2012-09-23 03:23:06 【问题描述】:

我在使用 libGDX 开发 2D 游戏时遇到了一些内存消耗问题。

这是一款具有丰富图形内容的 2D 游戏 - 有许多纹理、动画、字体等。 由于某些原因,所有图形内容都在游戏开始时加载 - 这是内存问题。我在不同的设备上测试了内存分配(本机和堆)并得到了不同的结果: (我已按纹理大小将所有设备分组)

第 1 组(约 840*480 屏幕采用的纹理)

HTC Desire (Froyo): 178Mb(native) - 12Mb(heap) - 应用程序加载成功

HTC One V (ICS): 30Mb(native) - 12Mb(heap) - 应用程序加载成功

HTC Desire S(果冻豆): 30Mb(native) - 12Mb(heap) - 应用程序加载成功

第 2 组(约 1366*768 屏幕采用的纹理)

三星(Google) Galaxy Nexus 329Mb(native) - 18Mb(heap) - 完美运行

Galaxy TAB(蜂窝) 164Mb(native) - 10Mb(heap) - 应用程序崩溃 (Surface.OutOfResouresException)。

我认为所有 android 版本上可能存在一些显着的内存管理差异,这给我带来了这些麻烦。

谁能解释在 android 3.x 上加载纹理时到底发生了什么?或者发布一些链接以了解解决此问题需要做些什么。

一些更新

今天我在 3.x 模拟器上做了一些额外的测试(我知道这不是最好的方法,但之前在 emu 和 Galaxy Tab 上的日志是相似的)

    我运行的游戏采用 1024*600 的纹理 - 应用在 80% 的加载资源(158 个本机内存分配)上崩溃 纹理为 800*480 - 应用在 100% 加载时崩溃(145Mb 本机内存分配)

最后,我在新的 Google Nexus 平板电脑 (Jelly Bean) 上运行了应用程序,它使用与 3.x 平板电脑 (1280*800px) 相同的纹理 - ~30Mb 本机内存和 ~12Mb 虚拟机堆。

现在我完全不明白发生了什么 - 纹理 800*480 和 1280*800 的内存分配相同...

终于

我已经通过一些进度条使用按需加载资源来解决这种情况。经过所有尝试,我没有找到另一种方法。

【问题讨论】:

【参考方案1】:

如果您想知道为什么 Android 3 崩溃超过 2.X,那是因为 ByteBuffer 错误。 ByteBuffer 使用 4 倍的内存。因此,您必须在 Android 3 中使用较低分辨率的图像。这已在 Android 4 中解决。

http://code.google.com/p/android/issues/detail?id=16941

幸运的是,对于 Android 3+,您有大堆选项(提供大约 128+ megs),这是我必须为我们的应用程序打开的选项。

【讨论】:

感谢您的回答,我想知道在小型资源平台上看到如此严重的错误。谷歌让我失望:(我曾尝试在清单中使用 largeHeap 选项 - 它将堆增加到 280Mb,但没有效果。 确实是严重的错误。幸运的是,当谈到平板电脑时,每个人都在转向 android 4,而 android 3 的市场份额很小。但正如我之前所说,当涉及到 Android 3 时,您将不得不降低图像的分辨率。 Android 4.0.3 的 Acer Iconia 标签上出现相同的错误 不可能是我所说的错误,因为它已在 4.0 中修复。尽量不要让内存崩溃是我发现的一个难题。事实上,我现在正在尝试修复一些应用程序。也许 Acer Iconia Tab largeHeap 不是那么大?您可能需要进行一些调试。我建议在设备崩溃之前转储设备的内存并使用 eclipse 插件内存分析。然后你就知道是什么在使用你的记忆了。【参考方案2】:

我相信如果位图的格式与显示的格式不匹配,位图的运行时内存使用量可能会增加(系统最终会创建一个具有正确格式的副本以进行 blit)。我认为这在较旧的 Android 系统上更多是一个问题,可能不是您在 3.0 上看到的,但可能值得研究。 (见Romain's post here末尾的性能位)

3.0 (Honeycomb) 中位图底层字节数组的内存占位图发生了变化,内存从本机端移动到 Java 堆。但是,这只是转移了内存,并且不应该影响实际限制(本机内存仍然根据相同的限制进行计算,只是对某些工具不可见)。

不同设备上的堆限制也不同。 (见Android heap size on different phones/devices and OS versions)

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

您可以在低内存设备上@9​​87654324@ 的位图。它可能也值得阅读 http://developer.android.com/training/displaying-bitmaps/index.html 的其余部分。

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

【讨论】:

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

以上是关于Android:LibGDX 2D游戏内存消耗的主要内容,如果未能解决你的问题,请参考以下文章

Android游戏框架Libgdx使用入门

Libgdx 游戏在 Android 上崩溃

获取 libGDX And​​roid 游戏的目录文件和 ClassLoader

Java libgdx:加载资产,内存使用情况

1.Libgdx扩展学习之Box2D_入门介绍

1.Libgdx扩展学习之Box2D_入门介绍