Android的graphics巨大的堆内存消耗? – LibGDX

我目前有一个空白的LibGDX应用程序, 什么都不做 。 它不渲染任何东西,也不更新任何东西。 这只是一个空的Screen 。 当我将应用程序部署到Android时,我遇到了一些可怕的内存消耗。 使用DDMS当应用程序在我的设备上运行时,我创build了以下转储:

在这里输入图像说明

内存最重要的用途是13.163 MB 1字节的数组分配。 这不是半堆吗?

我检查了分配情况,发现没有任何东西指向这样的大小:

在这里输入图像说明

现在使用Eclipse MAT分析堆转储:

在这里输入图像说明

所以内存的高度使用仍然来自byte []数组。 进一步分析字节[]部分,我想出了这个:

在这里输入图像说明

我现在看到巨大的byte []分配来自androidgraphics。 我甚至没有画任何东西! 有什么办法可以避免让这个应用程序的Androidgraphics部分占用一半的堆。 这只会导致在事情正在进行时发生超量垃圾收集,或者这是正常的,我只需要处理呢?

注:我正在使用libGDX版本1.4(或任何最新版本)的三星Galaxy S4上运行这个,

更新: 我没有发现14-13MB字节的数组分配是正常的应用程序,但我仍然有一个问题。 我的堆大小太小了。 如果Android的graphics占用我的一半堆,我没有什么有用的空间,垃圾收集器变得疯狂。 在另一个我用老版本的libgdx创build的应用程序(一个不可否认的更糟糕的应用程序)和堆大小是73 Mb。 我怎样才能增加堆大小? 我认为73 MB是相当大的,你可以看到大部分是不使用的。 以下是旧的应用程序的堆统计信息: 在这里输入图像说明

Related of "Android的graphics巨大的堆内存消耗? – LibGDX"

Android版本2.3之后,除了使用android:largeHeap属性之外,您无法对堆的大小进行任何操作。

有两种方法可以作弊, 如果你想要一个大堆不重要的话:

  1. 使用本地api分配内存 :不是一个好主意,因为它增加了复杂性,如果你不打算在本地代码中做的事情,
  2. 在执行之前分配一个不必要的大对象以获得所需的堆空间 :虽然它会给您足够的空间一次,但不保证堆大小将保持不变。

但是,如果需要resize,初始堆大小不是问题。 关于游戏生命周期中的内存pipe理我的看法与上面列出的两件事情有些不同,你可能在做什么。

对于一个级别或一个舞台等,你不应该在需要的时候在确切的时间分配内存。 这不仅会在分配内存时造成口吃,还会由于可能的存储I / O而造成口吃。 任何东西,比如声音,graphics,字体等都应该在关卡之前准备好。 这就是为什么很多游戏都有“加载”屏幕。 在开始游戏之前,你应该准备任何你可以做的事情。

对于一个小舞台来说,这样做可以,但是还是不行的。 随着事情变得复杂,它会降低性能。 很多游戏(比如体育游戏,赛车游戏等)在开始游戏之前进行分配。 其他人尽其所能。 一些开放的世界游戏(如GTA)不会加载地图中的所有地图对象,但它们有一个绘制距离,所以它们在地图中移动时绘制,当内存没有更多空间时,它们从内存中移除最远的对象。

[为什么你的应用程序与旧的LibGDX版本得到更多的堆大小可能是一个分配导致堆大小的增加和释放一些堆,使你得到一个很好的30%的使用率。

您可以在Android Manifest中分配此属性值:

机器人:largeHeap = “真”

请注意,这只适用于Android 3.0+

右键单击分配的对象,select“trace to GC root”,“不包含弱引用”

http://www.youtube.com/watch?v=_CruQY55HOk