在使用libGDX开发2D游戏时,我遇到了一些内存消耗问题。
这是一款具有丰富图形内容的2D游戏 - 有许多纹理,动画,字体等。 由于某些原因,所有图形内容都在游戏开始时加载 - 这是内存问题。我在不同的设备上测试了内存分配(本机和堆)并得到了不同的结果: (我按纹理大小划分了所有设备组)
第1组(~840 * 480屏幕采用的纹理)
HTC Desire(Froyo): 178Mb(本机) - 12Mb(堆) - 应用程序成功加载
HTC One V(ICS): 30Mb(本机) - 12Mb(堆) - 应用程序成功加载
HTC Desire S(Jelly Bean): 30Mb(本机) - 12Mb(堆) - 应用程序成功加载
第2组(〜1366 * 768个屏幕采用的纹理)
三星(Google)Galaxy Nexus 329Mb(原生) - 18Mb(堆) - 完美运行
Galaxy TAB(Honeycomb) 164Mb(本机) - 10Mb(堆) - 应用程序崩溃(Surface.OutOfResouresException)。
我认为在所有Android版本上可能存在一些重要的内存管理差异,这给我带来了这些麻烦。
任何人都可以解释在Android 3.x上加载纹理时究竟发生了什么?或者发布一些链接以了解解决此问题需要做些什么。
有些更新
Toady我在3.x模拟器上进行了一些额外的测试(我知道这不是最好的方法,但之前的日志类似于emu和Galaxy Tab)
最后我在新的谷歌Nexus平板电脑(Jelly Bean)上运行应用程序,该平板电脑使用与3.x平板电脑(1280 * 800px)相同的纹理 - 约30Mb本机内存和~12Mb vm堆。
现在我完全不了解正在发生的事情 - 纹理800 * 480和1280 * 800的相同内存分配......
最后
我已经使用一些进度条按需加载资源解决了这种情况。在所有的尝试后,我没有找到另一种方式。
答案 0 :(得分:3)
如果您想知道为什么Android 3崩溃超过2.X,那是因为ByteBuffer错误。 ByteBuffer使用4倍的内存。所以你必须使用Android 3的低分辨率图像。这在Android 4中得到了解决。
http://code.google.com/p/android/issues/detail?id=16941
Lucky for Android 3+你有大堆选项(提供大约128+ megs),这是我必须为我们的应用程序打开的。
答案 1 :(得分:1)
我相信如果位图的格式与显示格式不匹配,位图的运行时内存使用会膨胀(系统最终会创建一个具有正确格式的副本来进行blit)。我认为这在较旧的Android系统上更是一个问题,可能不是你在3.0上看到的,但可能值得研究。 (参见Romain's post here末尾的Performance位)
在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/
您可以在较低内存设备上load a scaled-down version位图。它也许值得阅读其余的http://developer.android.com/training/displaying-bitmaps/index.html。
您的应用程序有多少磁盘上的图像数据?你加载的其他非图像数据有多大(字体,动画等)?