LibGdx 屏幕:渲染和生命周期
LibGdx Screen: render and lifecycle
我有一个问题,我认为它与屏幕渲染及其生命周期有关。
基本上我有两个屏幕(菜单和游戏)。在 GameScreen 渲染方法中,我调用 World.update,然后调用我的渲染器。在(GameScreen 的)隐藏方法中,我处理了 Redner class.
的 SpriteBatch
所以当我将屏幕从游戏切换到菜单时(在 World.update 内)Java 崩溃。据我所知,处置造成了崩溃。
所以我的问题是,当我在渲染周期的中间设置一个新屏幕时,该渲染周期是否仍会以其旧屏幕结束?意思是,我是否在渲染完成之前调用 batch.dispose,这就是我遇到问题的原因?
感谢大家的帮助
public class GameScreen extends AbstractGameScreen {
private static final String TAG = GameScreen.class.getName();
private WorldController worldController;
private WorldRenderer worldRenderer;
private boolean paused;
public GameScreen(Game game) {
super(game);
}
@Override
public void render(float deltaTime) {
// Do not update game world when paused
if (!paused) {
// Update game world by the time that has passed since last render time
worldController.update(deltaTime);
}
// Sets the clear screen color to: Cornflower Blue
Gdx.gl.glClearColor(0x64 / 255.0f, 0x95 / 255.0f, 0xed / 255.0f, 0xff / 255.0f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
// Render game world to screen
worldRenderer.render();
}
@Override
public void resize(int width, int height) {
worldRenderer.resize(width, height);
}
@Override
public void show() { // Similar as create method
worldController = new WorldController(game);
worldRenderer = new WorldRenderer(worldController);
Gdx.input.setCatchBackKey(true);
}
@Override
public void hide() { // Similar to dispose method
worldRenderer.dispose();
Gdx.input.setCatchBackKey(false);
}
@Override
public void pause() {
paused = true;
}
@Override
public void resume() {
super.resume();
// Only called on Android
paused = false;
}
}
基本正确。从其 render
方法中调用 setScreen
的屏幕将在其自身上调用 hide
,然后将继续其 render
方法中的其余代码。所以你在尝试用它绘制之前就杀死了你的精灵批次。
所以不要从 hide
方法中调用 dispose
。事实上,屏幕对自身调用 dispose
可能是一种不好的做法。您可以为拥有它的游戏 class 保留它。例如,你可以在你的游戏中做这样的事情 class:
@Override
public void render() {
super.render();
if (getScreen() != gameScreen && gameScreen != null) {
gameScreen.dispose();
gameScreen = null;
}
}
顺便说一下,您应该将 SpriteBatch 放在您的游戏子 class 中,让所有不同的屏幕共享它。无缘无故分配和解除分配是一个相当大的对象。
我有一个问题,我认为它与屏幕渲染及其生命周期有关。 基本上我有两个屏幕(菜单和游戏)。在 GameScreen 渲染方法中,我调用 World.update,然后调用我的渲染器。在(GameScreen 的)隐藏方法中,我处理了 Redner class.
的 SpriteBatch所以当我将屏幕从游戏切换到菜单时(在 World.update 内)Java 崩溃。据我所知,处置造成了崩溃。 所以我的问题是,当我在渲染周期的中间设置一个新屏幕时,该渲染周期是否仍会以其旧屏幕结束?意思是,我是否在渲染完成之前调用 batch.dispose,这就是我遇到问题的原因?
感谢大家的帮助
public class GameScreen extends AbstractGameScreen {
private static final String TAG = GameScreen.class.getName();
private WorldController worldController;
private WorldRenderer worldRenderer;
private boolean paused;
public GameScreen(Game game) {
super(game);
}
@Override
public void render(float deltaTime) {
// Do not update game world when paused
if (!paused) {
// Update game world by the time that has passed since last render time
worldController.update(deltaTime);
}
// Sets the clear screen color to: Cornflower Blue
Gdx.gl.glClearColor(0x64 / 255.0f, 0x95 / 255.0f, 0xed / 255.0f, 0xff / 255.0f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
// Render game world to screen
worldRenderer.render();
}
@Override
public void resize(int width, int height) {
worldRenderer.resize(width, height);
}
@Override
public void show() { // Similar as create method
worldController = new WorldController(game);
worldRenderer = new WorldRenderer(worldController);
Gdx.input.setCatchBackKey(true);
}
@Override
public void hide() { // Similar to dispose method
worldRenderer.dispose();
Gdx.input.setCatchBackKey(false);
}
@Override
public void pause() {
paused = true;
}
@Override
public void resume() {
super.resume();
// Only called on Android
paused = false;
}
}
基本正确。从其 render
方法中调用 setScreen
的屏幕将在其自身上调用 hide
,然后将继续其 render
方法中的其余代码。所以你在尝试用它绘制之前就杀死了你的精灵批次。
所以不要从 hide
方法中调用 dispose
。事实上,屏幕对自身调用 dispose
可能是一种不好的做法。您可以为拥有它的游戏 class 保留它。例如,你可以在你的游戏中做这样的事情 class:
@Override
public void render() {
super.render();
if (getScreen() != gameScreen && gameScreen != null) {
gameScreen.dispose();
gameScreen = null;
}
}
顺便说一下,您应该将 SpriteBatch 放在您的游戏子 class 中,让所有不同的屏幕共享它。无缘无故分配和解除分配是一个相当大的对象。