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 的实例被删除。
我的 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 的实例被删除。