LibGdx RAM使用率不断增加

时间:2014-04-13 18:51:29

标签: java libgdx ram

我写了这3个类来测试它们在android上。如果我只是按菜单按钮并隐藏应用程序,然后再次打开它,然后再次隐藏并重新打开它,每次我隐藏应用程序时ram使用量都会增加。

如果我只是在应用程序内部的类之间切换,应用程序使用越来越多的内存,就会出现同样的问题。

我正在寻找这个问题的解决方案,我在yotube上看过教程,但我还没找到。我不明白这里可能出现的问题。

有人可以解释我做错了什么吗?

public class MyEF extends Game {

    @Override
    public void create() {

        setScreen(new TestScreen1(this));
    }

    @Override
    public void dispose() {
        super.dispose();
    }

    @Override
    public void render() {
        super.render();
    }

    @Override
    public void resize(int width, int height) {
        super.resize(width, height);
    }

    @Override
    public void pause() {
        super.pause();
    }

    @Override
    public void resume() {
        super.resume();
    }

}

// TEST1
public class TestScreen1 implements Screen {

    private MyEF game;

    public TestScreen1(MyEF game) {
        this.game = game;
    }

    @Override
    public void render(float delta) {
        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        if(Gdx.input.justTouched()){
            game.setScreen(new TestScreen2(game));
            dispose();
            System.out.println("TOUCHED ");
        }

    }

    @Override
    public void show() {
    }

    @Override
    public void dispose() {
        game.dispose();
    }

    @Override
    public void hide() {
    }
    @Override
    public void pause() {
    }
    @Override
    public void resume() {
    }
    @Override
    public void resize(int width, int height) {
    }
}

// TEST2
public class TestScreen2 implements Screen {

    private MyEF game;

    public TestScreen2(MyEF game) {
        this.game = game;
    }

    @Override
    public void render(float delta) {
        Gdx.gl.glClearColor(1, 1, 1, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        if(Gdx.input.justTouched()){
            game.setScreen(new TestScreen1(game));
            dispose();
            System.out.println("TOUCHED ");
        }

    }

    @Override
    public void show() {
    }

    @Override
    public void dispose() {
        game.dispose();
    }

    @Override
    public void hide() {
    }
    @Override
    public void pause() {
    }
    @Override
    public void resume() {
    }
    @Override
    public void resize(int width, int height) {
    }
}

2 个答案:

答案 0 :(得分:1)

由于这个原因,我没有任何静态Screens。 “重置”屏幕将引入错误,而不是可维护的代码。在许多情况下,只需创建一个新的“干净”屏幕就更容易了。

此处您还在描述效果。不是问题。是的,内存使用量增加。但这是一个问题吗?没有!为什么不?因为用户不会将应用程序发送到后台并连续1000次重新启动它。即使他这样做,内存使用也不会无休止地增长。它不断增长,因为添加的内存量太小,以至于JVM甚至都没有调用垃圾收集器。

在恢复应用程序的足够多次迭代之后,垃圾收集器最终会启动并清理所有未使用的屏幕。

通常,您不应该根据此行为立即更改您的体系结构。根据经验,您始终可以实例化新对象,例如切换屏幕或仅执行一次操作时。如果垃圾收集器在加载屏幕中启动,或者游戏刚刚启动,用户将不会受到打扰。您应该只关注在render()方法中执行此操作,因为垃圾收集器可能会在实际游戏过程中清理并可能导致滞后。

答案 1 :(得分:0)

Stuntmania是正确的。在render()方法中执行此操作时,创建新对象=增加了RAM使用量,尤其是。在游戏开发中,尤其是LibGDX,您应该始终质疑 new 关键字的用法。尽可能保持静止。

具体来说,你的主要游戏类应该做这样的事情:

public class MyEF extends Game {
    public static TestScreen1 myScreen1;
    public static TestScreen2 myScreen2;

    @Override
    public static void create() {
        myScreen1 = new TestScreen1(this);
        myScreen2 = new TestScreen2(this);
        setScreen(myScreen1);
    }

    (...)
}

然后,在每个屏幕的render()方法中,您只需拨打game.setScreen(myScreen2)即可。这样,您就不再在每个渲染周期中创建新对象。