libgdx屏幕的正确位置是什么

fnvucqvd  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(290)

你好,我正在制定一个游戏,我想知道如何处置资源,因为我遇到了内存问题。
我有这样的想法:

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 被称为。以前我把屏幕调整到 MapScree . 仍然是的渲染方法 splashScreenInstance 调用时,我收到空指针异常。为什么会这样?
我希望一旦我设置了另一个屏幕,上一个屏幕就不再呈现了。这似乎并非如此。我曾经尝试过在使用游戏示例设置屏幕之后,在我想要处理的屏幕上调用hide方法之后,以及在下一个屏幕的show方法上进行处理。所有这些情况在呈现当前屏幕之前仍会呈现前一个屏幕几次。
我真的需要恢复内存,而且我不想每次(在render方法上)都测试空指针,因为这会影响性能。
有什么建议吗?
谢谢

envsm3lx

envsm3lx1#

你在哪打电话 setScreen ? 因为所有的事情都应该发生在呈现线程中(甚至是inputlisteners),所以您应该能够调用 setScreen 在你的第一次 Screen 然后从render方法返回。这个 Game 示例将自动调用 hide 在你第一次 Screen 那是你可以打电话的地方 dispose .

gijlo24d

gijlo24d2#

我通常是这样处理这个问题的:

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() 在你的 hide() 方法 Screens ,因为这将是在 Game 将使用下一个屏幕。当可能有几个不同的下一个屏幕时,这尤其有用。在这种情况下,仍然只有一个地方 dispose() 那将是在 hide() 方法。

相关问题