2015-08-16 109 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