Android图形巨大的堆内存消耗?
我目前有一个空白的LibGDX
应用程序,它什么都不做 。 它不渲染任何东西,也不更新任何东西。 这只是一个空的Screen
。 当我将应用程序部署到Android时,我遇到了一些可怕的内存消耗。 使用DDMS我在设备上运行应用程序时创建以下堆转储:
内存最重要的用途是13.163 MB 1字节的数组分配。 这不是半堆吗?!
我检查了分配情况,发现没有任何东西指向分配的大小:
现在使用Eclipse MAT分析堆转储:
所以内存的高度使用仍然来自byte []数组。 进一步分析byte []部分,我想出了这个:
我现在看到巨大的byte []分配来自android图形。 我甚至没有画任何东西! 有什么办法可以避免让这个应用的Android图形部分占用一半的堆。 这只会导致在事情正在进行时发生超量垃圾收集,或者这是正常的,我只需要处理它呢?
注意:我正在使用libGDX版本1.4(或任何最新版本)的Samsung Galaxy S4上运行此操作,
更新: 我没有发现14-13MB字节的数组分配对于应用程序来说是正常的,但我仍然有问题。 我的堆大小太小。 如果Android图形占用了我的一半堆,我就没有什么用处,垃圾收集器变得疯狂了。 在另一个我用老版本的libgdx创建的应用程序(一个不可否认更糟糕的应用程序)和堆大小为73 Mb。 我怎样才能增加堆大小? 我认为73 MB是相当大的,你可以看到大部分没有被使用。 以下是旧应用程序的堆统计信息:
Android版本2.3之后,除了使用android:largeHeap属性之外,您无法对堆的大小进行任何操作。
有两种方法可以作弊, 如果你想要一个大堆不重要:
但是,如果在需要时调整大小,初始堆大小不是问题。 我对游戏生命周期中的内存管理的看法与上面列出的两件事以及你可能做的有些不同。
对于某个关卡或舞台等,您不应在需要时在确切的时间分配内存。 这不仅会在分配内存时造成口吃,还会由于可能的存储I / O而造成口吃。 任何东西,如声音,图形,字体等都应该在关卡之前准备好。 这就是为什么很多游戏都有“加载”屏幕的原因。 在开始比赛之前,你应该准备任何你可以做的事情。
对于一个小舞台来说,这样做确实不错 - 但仍然不好。 随着事情变得复杂,它会降低性能。 很多游戏(如体育游戏,赛车游戏等)在开始游戏之前都会进行分配。 其他人做得一样多,因为他们可以 。 一些开放的世界游戏(如GTA)不会加载地图中的所有地图对象,但它们具有绘制距离,因此当您在地图中移动时它们将绘制,并且当内存没有更多空间时它们会从内存中移除最远的对象。
[为什么你的应用程序与旧的LibGDX版本得到更多的堆大小可能是一个分配,导致堆大小的增加和释放一些堆的释放,以便你有30%的使用率。]
您可以在Android Manifest中分配此属性值:
机器人:largeHeap = “真”
请注意,这只适用于Android 3.0+
右键单击分配的对象,选择“trace to GC root”,“不包括弱引用”
http://www.youtube.com/watch?v=_CruQY55HOk
链接地址: http://www.djcxy.com/p/81427.html