2016-04-14 47 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 :)我保留通過應用程序生命週期加載的資產。但很高興知道我只應該初始化。我的資源如屏幕,舞臺,表格,按鈕等等! –