我正在制作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中删除。我在enemy = null;
执行时尝试添加it.remove();
。但它似乎只是删除了我使用enemy
创建的变量it.next();
,而不是真正的敌人。
我用来添加敌人的方法是enemies.add(new Enemy());
。
我使用Runtime.getRuntime().totalMemory()
检查了记忆,并且它一直在增加直到最大值,游戏崩溃了。
答案 0 :(得分:1)
it.remove
将从enemies
集合中删除当前Enemy实例的引用。如果这是对实例的唯一引用,它将有资格进行垃圾回收。没有必要将本地enemy
变量设置为null,因为它将在循环的下一次迭代中被覆盖。
你的记忆问题可能在其他地方。删除Enemy
时,通常会创建一个Corpse
实例。您应该检查corpses
集合的大小,看它是否增长太多。