我目前正在使用libGDX开发游戏;但是,在我的两个不同设备上运行时,内存使用量存在巨大差异。
我目前正在使用HTC One X +和Nexus 7进行测试。在测试时,我注意到Nexus 7具有更大的堆大小,并且还使用了更多的堆。在使用Android设备监视器进行调查时,我注意到1字节数组在设备之间完全不同(6 MB与48 KB),而其他一切都非常相似。
我认为问题在于纹理和设备之间的不同分辨率(1280x720与1920×1200)以及libGDX如何存储信息。虽然,与普通的Android编程不同,没有办法拥有不同的纹理集(drawable-hdpi vs drawable-xxhdpi),因为它们都在assets文件夹中。
如何改善目前正在使用的内存?
以下是我一直在研究的一些数据。这只是坐在主菜单上,显示了2个纹理,没有任何更新。
Nexus 7 (vs) HTC One X+
堆:9.6 MB(vs)4.8 MB
分配:9.1 MB(vs)3.0 MB
免费:537 KB(vs)1.8 MB
使用:94.53%(vs)62.70%
对象:48,024(vs)46,012
免费:402 KB(vs)1.8 MB
数据:914 KB(vs)860 KB
class:1 MB(vs)1.1 MB
1字节:6 MB(vs)48.6 KB
2字节:705 KB(vs)633 KB
4字节:399 KB(vs)405 KB
8字节:9.3 KB(vs)6 KB
非Java:70 KB(vs)6 KB
07-19 05:39:09.651 6453-6469 / com.mygdx.game.android D / dalvikvm:GC_FOR_ALLOC释放524K,7%免费9442K / 10128K,暂停19ms,总计20ms
07-19 05:39:12.644 6453-6469 / com.mygdx.game.android D / dalvikvm:GC_FOR_ALLOC释放512K,7%免费9442K / 10128K,暂停18ms,总计18ms
07-19 05:39:15.657 6453-6469 / com.mygdx.game.android D / dalvikvm:GC_FOR_ALLOC释放512K,7%免费9442K / 10128K,暂停24ms,总计25ms
07-19 05:39:18.660 6453-6469 / com.mygdx.game.android D / dalvikvm:GC_FOR_ALLOC释放511K,7%免费9442K / 10128K,暂停24ms,总计24ms
我使用Android Studio(Beta)0.8.0中的LibGDX Setup App创建了一个新项目。 对代码的唯一更改是build.gradle:
classpath 'com.android.tools.build:gradle:0.12.+'
而不是
classpath 'com.android.tools.build:gradle:0.10+'
目前仍在Nexus 7上使用96%的堆空间。
public class myGame extends ApplicationAdapter {
SpriteBatch batch;
Texture img;
@Override
public void create () {
batch = new SpriteBatch();
img = new Texture("badlogic.jpg");
}
@Override
public void render () {
Gdx.gl.glClearColor(1, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
batch.draw(img, 0, 0);
batch.end();
}
}
答案 0 :(得分:1)
您可以使用相同的工具找出分配内存的原因。您可以获得违规代码的回溯。这应该有助于解释1字节数组的来源。 (正如Xoppa所说,如果你没有分配东西,GC不会运行,所以你必须直接或间接地触发分配,因为你通常不想要任何经常运行的方法中的分配,如render
)。
只需使用下一个标签(" Allocation Tracker")。让您的应用程序进入稳定状态(启动期间的分配并不是那么有趣)。转到选项卡,单击"开始跟踪",等待5-10秒,单击"获取分配",您应该看到关于谁分配内存及其原因的非常准确的答案。见http://developer.android.com/tools/debugging/debugging-memory.html
(Nexus 7有一个更大的堆,所以它可能只是让更多的东西在运行GC之前在堆上累积,而较小的堆需要更频繁地收集,因此积累的东西越少。)< / p>