2014-10-08 57 views
0

在我的遊戲中,我有這段代碼。它呈現一個紋理作爲一個按鈕:呈現紋理導致內存泄漏

private void drawStart(){ 

    startTexture = new Texture(Gdx.files.internal("start.png")); 
    startTexture.setFilter(TextureFilter.Linear, TextureFilter.Linear); 
    stageStart = new Stage(); 
    stageStart.clear(); 
    buttonStart = new Image(startTexture); 
    buttonStart.setX(10); 
    buttonStart.setY(Gdx.graphics.getHeight()/2.75f); 
    buttonStart.setWidth(Gdx.graphics.getWidth()/4); 
    buttonStart.setHeight(Gdx.graphics.getHeight()/4); 




    Gdx.input.setInputProcessor(stageStart); 

    buttonStart.addListener(new ClickListener() { 
     public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) 
     { 
      currentState = GameState.RESET; 
      startTexture.dispose(); 
      stageStart.dispose(); 


      return true; 
     } 
    }); 
    stageStart.addActor(buttonStart); 
    stageStart.draw(); 
    startTexture.dispose(); 

}

但是,每當我把drawStart();到我的渲染方法中,Java Heap和Native Heap每10秒緩慢增加1。所以,如果用戶在菜單上離開遊戲約5分鐘,遊戲將在他們的手機上崩潰。我已經測試過它,只有在渲染紋理時纔會發生。

我希望能夠解決這個問題。我已經嘗試了一個if語句,說明如果呈現= 0,渲染紋理,然後設置呈現1,但沒有奏效。

+1

爲什麼要把'drawStart()'放到你的渲染方法中?這基本上是創造一個新的紋理,新的階段(沒有正確處理它),新的圖像和一個新的ClickListener每秒60次左右? – Xoppa 2014-10-08 20:53:12

+0

對不起,我的錯誤代碼,我只在3個月前學過java。我將如何去渲染一次? – Ash 2014-10-08 20:59:22

+0

Libgdx不是學習java的最佳開始。如果你的意思是你認爲你知道(並理解)了足夠多的java來採取步驟進入libgdx,那麼我建議看看[教程]之一(https://github.com/libgdx/libgdx/wiki/External-tutorials),以便您確定瞭解[生命週期](https://github.com/libgdx/libgdx/wiki/The-lifecycle)。然而,就像所說的,至少有關java,oop(尤其是gc)的基本知識是強烈推薦的。 – Xoppa 2014-10-08 21:11:33

回答

0

這可能對你有所幫助。你只需要在你的渲染中繪製。所以現在你可以把drawStart()放在你的渲染方法中,它只會繪製舞臺,而屏幕不會忘記調用dispose。

private void drawStart(){ 
     stageStart.draw(); 
    } 

    public void initialize() { 
     startTexture = new Texture(Gdx.files.internal("start.png")); 
     startTexture.setFilter(TextureFilter.Linear, TextureFilter.Linear); 
     stageStart = new Stage(); 
     stageStart.clear(); 
     buttonStart = new Image(startTexture); 
     buttonStart.setX(10); 
     buttonStart.setY(Gdx.graphics.getHeight()/2.75f); 
     buttonStart.setWidth(Gdx.graphics.getWidth()/4); 
     buttonStart.setHeight(Gdx.graphics.getHeight()/4); 

     Gdx.input.setInputProcessor(stageStart); 

     buttonStart.addListener(new ClickListener() { 
      public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) 
      { 
       currentState = GameState.RESET; 
       startTexture.dispose(); 
       stageStart.dispose(); 


       return true; 
      } 
     }); 
     stageStart.addActor(buttonStart); 
    } 

    public void dispose() { 
     startTexture.dispose(); 
    } 
+0

謝謝,現在只需要在Java堆和本地堆中使用1MB。 – Ash 2014-10-09 17:48:06

0

您的問題是,在drawStart()中,您正在創建新的Texture和新的Stage
如果您每調用一次渲染循環,都會創建新的Texture s和一個new Stage約60次/秒。
這ofc導致內存泄漏。 只能在構造函數或create()show()方法中加載/創建TextureStage一次。
同時考慮在需要時處置它們。 Here是您需要手動處理的東西的列表。
在渲染循環中,你應該只更新和繪製的東西。

但是,因爲你只有3個月的經驗,我建議你先學習基礎知識。不要急於進入遊戲編程,它會殺死你的動機。
首先學習基礎知識,然後從一些ASCII遊戲(命令行)開始,然後您可以從libgdx開始。

如果您準備好了libgdx,請閱讀Wiki(至少您需要的部分)以及一些tutorials(也許它們不使用最新版本的libgdx,但概念應該差不多一樣這應該有助於你理解它。)

+0

感謝您的支持! – Ash 2014-10-09 17:48:25