什么是处理libgdx屏幕的正确位置

时间:2014-03-11 17:48:20

标签: java libgdx

您好我正在制作一款游戏,我想知道如何处理资源,因为我遇到了内存问题。

我有这样的事情:

public SplashScreen implements Screen {
    @Override
    public void render(float delta) {
    }
    @Override
    public void dispose() {
        if (batch != null)
            batch.dispose();
        batch = null;
    }
}

public MapScreen implements Screen {
    @Override
    public void render(float delta) {
    }
    @Override
    public void show() {
        splashScreenInstance.dispose();
    }
    @Override
    public void dispose() {
        if (mesh != null)
        mesh.dispose();
        mesh = null;
    }
}

我会在调用MapScreen的show方法时立即处理启动画面。之前我已将屏幕设置为MapScree。仍调用splashScreenInstance的render方法,并且我收到了空指针异常。为什么会这样?

我希望一旦我设置了另一个屏幕,就不再渲染前一个屏幕了。这似乎不是这样。我尝试在使用游戏实例设置屏幕后立即进行处理,在我想要处理的屏幕上调用hide方法之后,最后在下一个屏幕的show方法上。在渲染当前屏幕之前,所有这些情况仍会将前一个屏幕渲染几次。

我真的需要恢复内存,而且我不想每次(在渲染方法上)测试空指针,因为这会有性能损失。

有什么建议吗?

由于

2 个答案:

答案 0 :(得分:3)

这就是我通常处理这个问题的方法:

public SplashScreen implements Screen {
    @Override
    public void render(float delta) {
        // I assume that you have a reference to the game somewhere to switch the screen
        game.setScreen(new MapScreen());
        dispose();
        return;
    }
}

我首先设置新的Screen,然后dispose()当前的设置,然后立即通过return停止当前屏幕的进一步执行。这样就应该停止当前的渲染周期,并在下一个周期中调用下一个屏幕的render()

另一种方法可能是在dispose()的{​​{1}}方法中调用hide(),因为这将是Screens使用之前调用的最后一种方法下一个屏幕。当可能有几个不同的下一个屏幕时,这尤其有用。在这种情况下,Game仍然只有一个地方,而且会在dispose()方法中。

答案 1 :(得分:1)

你在哪里打setScreen?由于一切都应该在渲染线程中发生(甚至是InputListeners),您应该能够在第一个setScreen中调用Screen,然后从render方法返回。 Game个实例会在您hide的第一个Screen上自动拨打dispose