【问题标题】:What's the right place to dispose a libgdx Screen什么是配置 libgdx 屏幕的正确位置
【发布时间】:2014-03-11 17:48:19
【问题描述】:

您好,我正在开发一款游戏,我想知道如何处理资源,因为我遇到了内存问题。

我有这样的事情:

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 的渲染方法,并且我收到了空指针异常。为什么会这样?

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

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

有什么建议吗?

谢谢

【问题讨论】:

    标签: java libgdx


    【解决方案1】:

    我通常是这样处理这个问题的:

    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() 将被调用。

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

    【讨论】:

    • 谢谢,是的,但是这样你仍然需要在渲染方法中加入一些逻辑。这个逻辑将被称为每个 FPS。实际上我有类似的东西,检查空指针然后渲染,但渲染内部仍然有逻辑......如果我能避免这种情况,我会很高兴。
    • 您需要在 render 方法中添加一些逻辑,因为如果不是从 render 方法切换屏幕,您将如何切换屏幕?此外,这种逻辑不会导致任何更少的 FPS。可能会低于 0.0000001 FPS 或在该范围内。
    • 谢谢,我正在使用监听器,因此错过了干净的回报。我将重写以处理退货。
    【解决方案2】:

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

    【讨论】:

    • 有时我调用渲染,有时调用应用程序监听器。也许我会处理并解决一个布尔值,以避免在处理时进行渲染。无论如何感谢您的提示。我要考试了。
    猜你喜欢
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 2014-02-24
    相关资源
    最近更新 更多