什么是处理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方法,并且我收到了空指针exception。 为什么会这样?

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

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

有什么建议么?

谢谢

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

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

 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()当前Screen ,然后通过return立即停止当前屏幕的任何进一步执行。 这样就应该停止当前的渲染周期,并在下一个循环中调用下一个屏幕的render()

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