【问题标题】:LibGdx Screen: render and lifecycleLibGdx 屏幕:渲染和生命周期
【发布时间】:2015-07-02 10:11:12
【问题描述】:

我有一个问题,我认为它与屏幕渲染及其生命周期有关。 基本上我有两个屏幕(菜单和游戏)。在 GameScreen 渲染方法中,我调用 World.update,然后调用我的渲染。在(GameScreen 的)隐藏方法中,我从 Redner 类中处理了 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;
    }
}

【问题讨论】:

    标签: java libgdx


    【解决方案1】:

    这基本上是正确的。从其render 方法中调用setScreen 的屏幕将在其自身上调用hide,然后将继续通过其render 方法中的其余代码。所以你在尝试绘制之前就杀死了你的精灵批次。

    所以不要在你的hide 方法中调用dispose。事实上,Screen 自己调用dispose 可能是不好的做法。您可以为拥有它的 Game 类保留它。例如,您可以在游戏类中执行以下操作:

    @Override
    public void render() {
        super.render();
        if (getScreen() != gameScreen && gameScreen != null) {
            gameScreen.dispose();
            gameScreen = null;
        }
    }
    

    顺便说一句,您可能应该将 SpriteBatch 放在您的 Game 子类中,并让所有不同的屏幕共享它。这是一个相当大的对象,无缘无故地分配和释放。

    【讨论】:

    • 完美,谢谢。还有一个问题。看着我的两个屏幕(主菜单和游戏)。在它们之间切换、使用它们或处理它们时的最佳做法是什么。如果我不处理它们,我是否应该在 menuScreen 中处理 gameScreen 的 SpriteBatch ?
    • SpriteBatch 应该只在游戏完全关闭时才被释放(在你的 Game 类的 dispose 方法中),因为你在每个屏幕上都需要它。释放它并分配一个新的是浪费时间。对于整个屏幕,没有最佳实践,因为它取决于游戏。我正在做一个非常简单的游戏,我可以轻松地将整个游戏一直保存在内存中,所以我从不处理屏幕。但是,如果您的内存使用率越来越高,您可能需要这样做。菜单屏幕可能不会使用太多,所以除了从一个阶段切换到另一个阶段时,可能始终保持屏幕打开。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多