LibGDX - 1字节数组大小因不同分辨率而异

时间:2014-07-18 20:59:02

标签: android libgdx textures

我目前正在使用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个纹理,没有任何更新。

HTC One X +堆 - 62.70%已使用(1280 x 720)

HTC One X+ Heap

Nexus 7堆 - 94.53%已使用(1920 x 1200)

Nexus 7 Heap

数据比较

    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

Logcat(垃圾收集器经常被调用。)

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();
    }
}

1 个答案:

答案 0 :(得分:1)

您可以使用相同的工具找出分配内存的原因。您可以获得违规代码的回溯。这应该有助于解释1字节数组的来源。 (正如Xoppa所说,如果你没有分配东西,GC不会运行,所以你必须直接或间接地触发分配,因为你通常不想要任何经常运行的方法中的分配,如render)。

只需使用下一个标签(" Allocation Tracker")。让您的应用程序进入稳定状态(启动期间的分配并不是那么有趣)。转到选项卡,单击"开始跟踪",等待5-10秒,单击"获取分配",您应该看到关于谁分配内存及其原因的非常准确的答案。见http://developer.android.com/tools/debugging/debugging-memory.html

(Nexus 7有一个更大的堆,所以它可能只是让更多的东西在运行GC之前在堆上累积,而较小的堆需要更频繁地收集,因此积累的东西越少。)< / p>