mat*_*ory 8 java memory heap android libgdx
我目前有一个空白的LibGDX应用程序,什么都不做.它不会呈现任何内容,也不会更新任何内容.这只是空洞的Screen.当我将应用程序部署到android时,我遇到了一些可怕的内存消耗.使用DDMS我在我的设备上运行应用程序时创建以下堆转储:

内存最重要的用途是13.163 MB 1字节数组分配.这不是堆的一半吗?!
我检查了分配,发现没有任何指向分配的大小:

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

因此,内存的高使用率仍来自byte []数组.进一步分析byte []部分我想出了这个:

我现在看到巨大的byte []分配来自android图形.我甚至没有画任何东西!有什么方法可以避免让这个应用程序的Android图形部分占用一半的堆.这只会导致过多的垃圾收集在事情真正发生时发生,或者这是正常的,我只需要处理它?
注意:我在带有libGDX 1.4版的三星Galaxy S4上运行它(或者不管最新版本是什么)
更新:我没有发现应用程序的14-13MB字节数组分配是正常的,但我仍然有问题.我的堆大小太小了.如果Android图形占据了我的堆的一半,我几乎没有任何有用的空间,垃圾收集器变得疯狂.在我使用旧版本的libgdx创建的另一个应用程序(一个无可否认的编码较差的应用程序),堆大小为73 Mb.如何增加堆大小?我认为73 Mb相当大,你可以看到它的大部分都没用过.以下是旧应用程序的堆统计信息:

小智 6
在Android 2.3版之后,除了使用android:largeHeap属性之外,你无法对堆的大小做任何事情.
如果你想要一个大堆而不管什么,有两种方法可以作弊:
但是,如果在需要时调整大小,初始堆大小不是问题.我对游戏生命周期中的内存管理的看法与上面列出的两件事以及您可能正在做的事情略有不同.
对于级别或阶段等,您不应在需要时的确切时间分配内存.这不仅会在分配内存时造成断断续续,而且由于可能的存储I/O而导致断断续续.任何东西,如声音,图形,字体等都应该在一个级别之前准备好.这就是很多游戏都有"加载"屏幕的原因.在开始游戏之前,您应该准备任何可以做的事情.
对于一个小阶段,这样做是可以的 - 但仍然不好 - .随着事情变得复杂,它将降低性能.许多游戏(如体育游戏,赛车游戏等)在开始游戏之前进行分配.其他人尽可能地做到这一点.一些开放世界游戏(如GTA)不会加载地图中的所有地图对象,但是它们具有绘制距离,因此当您在地图中移动时它们会绘制,并且当内存不再有空间时它们会从内存中移除最远的对象.
[你的应用程序使用较旧的LibGDX版本获得更多堆大小的原因可能是一个分配导致堆大小的增加和释放,释放了一些堆,以便你获得30%的良好使用率.
| 归档时间: |
|
| 查看次数: |
4075 次 |
| 最近记录: |