Java 什么';这是处理libgdx屏幕的正确位置

Java 什么';这是处理libgdx屏幕的正确位置,java,libgdx,Java,Libgdx,您好,我正在制作一个游戏,我想知道如何处理资源,因为我遇到了内存问题 我有这样的想法: public SplashScreen implements Screen { @Override public void render(float delta) { } @Override public void dispose() { if (batch != null) batch.dispose(); ba

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

我有这样的想法:

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方法上进行处理。所有这些情况都会在渲染当前屏幕之前渲染上一个屏幕几次

我真的需要恢复内存,而且我不想每次(在render方法上)都测试空指针,因为这会影响性能

有什么建议吗


谢谢

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

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;
    }
}
我首先设置新的
屏幕
,然后将
dispose()
设置为当前屏幕,然后通过
return
立即停止当前屏幕的任何进一步执行。这样,应停止当前渲染周期,并在下一个周期中调用下一个屏幕的
render()


另一种方法可能是在
屏幕
hide()
方法中调用
dispose()
,因为这将是
游戏
使用下一个屏幕之前调用的最后一个方法。当可能有几个不同的下一个屏幕时,这尤其有用。在这种情况下,仍然只有一个
dispose()
位置,该位置将位于
hide()
方法中。

您在哪里调用
setScreen
?由于所有事情都应该发生在渲染线程中(甚至是InputListeners),因此您应该能够在第一个
屏幕中调用
设置屏幕
,然后从渲染方法返回。
Game
实例将在第一个
屏幕上自动调用
hide
,在那里您可以调用
dispose

,谢谢,没有人,是的,但是这样您仍然需要在渲染方法中加入一些逻辑。该逻辑将被称为每个FPS。实际上我有类似的东西,检查空指针,然后进行渲染,但渲染内部仍然有逻辑。。。如果我能避免这种情况,我会很高兴的。你需要在渲染方法中加入一些逻辑,因为如果不是从渲染方法切换屏幕,你还怎么切换屏幕?此外,该逻辑不会导致FPS减少。可能是0.0000001 FPS或者在这个范围内。谢谢你,我使用的是一个监听器,因此错过了一个干净的返回。我将重写以处理返回。有时我调用render,有时调用applicationlistener。也许我会处理一个布尔值,以避免在处理时渲染。无论如何,谢谢你的提示。我要去考试。