我正在制作一款 2D 射击游戏,你可以在其中射击敌人,然后敌人就会爆炸。这是我的渲染方法:
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;
}
}
}
好吧,我想做的就是,将被移除的敌人设置为 null,这样垃圾回收就可以将其从 JVM 中移除。我尝试在执行 it.remove();
时添加 enemy = null;
。但它似乎只是删除了我使用 it.next();
创建的变量 enemy
,而不是实际的敌人。
我用于添加敌人的方法是 enemies.add(new Enemy());
。
我使用Runtime.getRuntime().totalMemory()
检查了内存,它不断增加直到最大值,然后游戏崩溃了。
最佳答案
it.remove
将从 enemies
集合中删除当前 Enemy 实例的引用。如果这是对该实例的唯一引用,则它将有资格进行垃圾回收。无需将本地 enemy
变量设置为 null,因为无论如何它都会在循环的下一次迭代中被覆盖。
您的内存问题可能出在其他地方。当您删除Enemy
时,您通常会创建一个Corpse
实例。您应该检查 corpses
集合的大小,看看它是否增长太多。
关于java - 当 iterator.remove() 时将变量设置为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32032234/