什么是处理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()
方法中。