LibGDX: 无法销毁屏幕。内存泄漏

LibGDX: Cannot destory screen. Memory leaks

我的 LibGDX 游戏有问题。在屏幕之间切换时会发生内存泄漏。这是我主要 class 扩展 Game 的一部分。我用这个 class 在屏幕之间切换。

private LoadingScreen loadingScreen;
private Screen s = null;

public static enum Screens
{
    MAIN, START_SCREEN, CASUAL_LEVEL, NORMAL_LEVEL, HARDCORE_LEVEL, CREDITS,
}

@Override
public void create()
{
    s = new LoadingScreen(this);

    setScreen(s);
}

@SuppressWarnings("static-access")
public void gotoScreen(Screens screen)
{
    s.dispose();
    s = null;

    if (screen == screen.MAIN)
    {
        s = new Main(this);
    }

    if (screen == screen.START_SCREEN)
    {
        s = new StartScreen(this);
    }

    if (screen == screen.CASUAL_LEVEL)
    {
        s = new CasualLevel(this);
    }

    if (screen == screen.NORMAL_LEVEL)
    {
        s = new NormalLevel(this);
    }

    if (screen == screen.HARDCORE_LEVEL)
    {
        s = new HardcoreLevel(this);
    }

    if (screen == screen.CREDITS)
    {
        s = new Credits(this);
    }

    super.setScreen(s);
}

如您所见,我将 this class 传递到我的每个屏幕,以便我可以在屏幕之间切换。我还将旧屏幕设置为 null,这基本上应该会破坏它并踢出内存。

当我离开一个屏幕然后尝试稍后从头开始重新创建它时会出现问题。不是重新创建它,而是神奇地恢复了我之前关闭的那个。

屏幕上所有来自其先前实例的项目仍然存在。此外,每次切换屏幕时,内存使用量都会增加。例如。如果我从开始屏幕转到休闲,然后回到开始屏幕,然后再回到休闲,内存使用量会加倍。

我尝试 google 几个小时了,我看到有人遇到与 libgdx 完全相同的问题,但似乎没有人知道答案。

简而言之,如何完全杀死一个屏幕,以便在我下次尝试初始化它时从头开始重新创建它?

我已经尝试在 s = null 之后调用 this.finalize()System.gc(),但它不起作用。内存使用量不断增长。

我稍微修改了一下代码

public void gotoScreen(Screens screen)
{
    System.gc();
    if (screen == screen.MAIN)
    {
        super.setScreen(new Main(this));
    }

    if (screen == screen.START_SCREEN)
    {
        super.setScreen(new StartScreen(this));
    }

    if (screen == screen.CASUAL_LEVEL)
    {
        super.setScreen(new CasualLevel(this));
    }

    if (screen == screen.NORMAL_LEVEL)
    {
        super.setScreen(new NormalLevel(this));
    }

    if (screen == screen.HARDCORE_LEVEL)
    {
        super.setScreen(new HardcoreLevel(this));
    }

    if (screen == screen.CREDITS)
    {
        super.setScreen(new Credits(this));
    }
}

现在,使用 VisualVM,我可以看到在屏幕之间切换时 Screens 的实例被删除。