2016-04-14 51 views
0

我有一个带有4个屏幕的UI,我的应用程序非常笨重,并且在大约250MB的RAM使用情况下启动,在屏幕之间来回切换几次之后,在崩溃之前高达800MB的Ram。LibGdx - 当切换屏幕时发生严重内存泄漏

这是我如何处理处置:

每个屏幕extends MainScreen,在那里我有这样的处理方法:

@Override 
    public void dispose() 
    { 
     stage.dispose(); 
     System.out.println("Disposing Main Screen"); 
    } 

当设置一个新的屏幕我这样做:

dispose(); 
game.setScreen(new HighScoreScreen(game)); 

现在我在启动时使用AssetManager加载我的所有资产,这意味着我不会卸载/提取屏幕中的任何资源,因为这会导致在下一个屏幕上显示一个空的黑匣子,而不是放置的资产。但这是一个问题吗?我有很多资源,例如8个不同的BitmapFonts每次我加载一个扩展MainScreen的新屏幕时,都会进行初始化。但是,如果我尝试处理这些,则在下次尝试初始化它们时出现错误。

剩下的唯一东西是diposable纹理/字体,所以这是什么导致我的问题?我应该为每个屏幕加载/卸载吗?这看起来像会导致大量加载时的不良用户体验。

+0

什么是您的资产的近似分辨率? –

+0

@ BigTony.D我使用1080x1800分辨率,UI使用1GB和3个地图集,以及一些字体和一些声音。 –

+0

您是否试图让资产更小?当我们被迫将所有资产缩减到最大时,我们遇到了与iOS类似的问题。分辨率为1024 x 1024,因为iOS上的应用程序崩溃。 –

回答

0

正如@TomGrill Games所说,你应该初始化你的资源一次,然后在你的主类中使用它们。你可能有一个资源类,在你的主类中初始化,然后从那里调用你的资源。您的代码可能看起来像:

game.setScreen(game.mainScreen); 

game.setScreen(game.resources.mainScreen); 

也将这样做,以你的声音,和其他资源。

+0

对于声音和其他资产,我使用AssetManager :)我保留通过应用程序生命周期加载的资产。但很高兴知道我只应该初始化。我的资源如屏幕,舞台,表格,按钮等等! –