您好我正在制作一款游戏,我想知道如何处理资源,因为我遇到了内存问题。
我有这样的事情:
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方法上。在渲染当前屏幕之前,所有这些情况仍会将前一个屏幕渲染几次。
我真的需要恢复内存,而且我不想每次(在渲染方法上)测试空指针,因为这会有性能损失。
有什么建议吗?
由于
答案 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
。