2015-08-16 56 views
0

我正在做一個2D射擊遊戲,在那裏你可以射擊敵人,它會爆炸。這是我的渲染方法:設置變量爲null時iterator.remove()

public void renderEnemies(Graphics2D g) { 
    for (Iterator<Enemy> it = enemies.iterator(); it.hasNext();) { 
     Enemy enemy = it.next(); 
     enemy.render(g); 
     if (enemy.die) { // die 
      it.remove(); 
      playSound(4); 
      corpses.add(new Corpse(1, enemy.x, enemy.y)); 
      currentEnemyLife = 0; 
     } 
     if (enemy.x < 0) { // out of screen 
      if (!enemy.die) { 
       hero.LIFE--; 
      } 
      it.remove(); 
      currentEnemyLife = 0; 
     } 
    } 
} 

嗯,我想要做的是,設置輾轉空的敵人,所以垃圾收集可以從JVM中刪除。當我執行it.remove();時,我試圖添加enemy = null;。但它似乎只是刪除我使用it.next();創建的變量enemy,而不是實際的敵人。 我用來增加敵人的方法是enemies.add(new Enemy());

我使用Runtime.getRuntime().totalMemory()檢查了內存,並一直增加到最大值,遊戲崩潰。

+0

你不必設置enemy = null,1.估計最大內存是多少? 2.可能你有另一個敵人的參考(如果這個問題),嘗試檢查從java堆 –

+0

對象的數量(通過他們的類型),最大內存是259522560,我沒有任何參考敵人。 –

+0

你會得到更多的信息,爲什麼你使用內存分析儀內存不足 –

回答

1

it.remove將從enemies集合中刪除當前Enemy實例的引用。如果這是對實例的唯一引用,它將有資格進行垃圾回收。無需將本地enemy變量設置爲空,因爲無論如何,它將在循環的下一次迭代中被覆蓋。

您的記憶問題可能在別處。當您刪除Enemy時,通常會創建Corpse實例。你應該檢查corpses集合的大小,看它是否增長太多。

+0

我已經檢查過屍體的大小,它工作正常,因爲我也有類似的方法來renderEnemies,將刪除屍體。 –

+0

@KongponCharanwattanakit在這種情況下,您的問題可能在其他地方。我建議你添加調試打印,顯示敵人和屍體集合的大小,看看問題是否是其中之一。如果沒有,你應該看看其他地方。 – Eran

相關問題