删除对象以释放内存JAVA

17 浏览
0 Comments

删除对象以释放内存JAVA

我正在开发一个小型的太空射击游戏。这是学习JAVA的有趣方式,我想确保我的做法是正确的。\n在运行时,这个对象(飞船)会生成其他对象(激光)。\n我是这样实现的:\n

    \n

  • 屏幕上绘制了飞船。当检测到触摸时,它会创建类Laser的新实例,然后将它们添加到GameScreen类中的静态LinkedList lasers中。
  • \n

  • GameScreen对象负责在屏幕上绘制和更新所有的激光、飞船和特效。
  • \n

\n这是不言而喻的。但是现在:\n

    \n

  • 调用detectCollision(),将与飞船对象相交的所有激光从LinkedList lasers中删除。
  • \n

  • 在游戏结束时(用户退出),我遍历存储在GameScreen.lasers链表中的Laser类的所有实例,并将它们全部设置为null。完成后,我还将列表设置为null。
  • \n

\n这是释放分配的内存的正确方法吗?\n激光创建:\n

abstract class Ship {
if (canShoot()) {
    Laser laser = new Laser(new Rectangle(x, y, width, height)); // bounds
    GameScreen.playerLasers.add(laser);
}}

\n激光销毁:\n

public class GameScreen {
private void dispose() {
    for (Laser laser : playerLasers) {
        laser.bounds = null;
        laser = null;
    }
    playerLasers = null;
}}

\nGameScreen类的collisionDetection():\n

public class GameScreen {
    private void detectCollision() {
        ListIterator itr = playerLasers.listIterator();
        while (itr.hasNext()){
            Laser laser = itr.next();
            if (laser.bounds.overlaps(ship.bounds)){
                ship.health -= laser.damage;
                laser.bounds = null;
                laser = null;
                itr.remove();
}}}}

0
0 Comments

问题原因:Java是一种垃圾回收系统,无法手动释放内存。将对象设置为null并不会导致释放内存。Java会自动清理不再使用的对象,无需进行任何操作。需要关注的只是编程逻辑。

解决方法:在这种情况下,需要使用itr.remove();来从游戏逻辑中移除laser对象,而不是释放内存。因此,删除null分配行后,代码如下:

if (laser.bounds.overlaps(ship.bounds)){
    ship.health -= laser.damage;
    itr.remove();
}

关于为什么会有这个问题,可以参考这个链接:link。这是一个非常复杂的问题,通常不会遇到,并且与您的情况无关。他们为了创建仍然可以“访问”的对象而费尽心思。如果从迭代器中删除了laser对象,您将无法再访问它,垃圾回收器将会自动处理一切。

感谢您的帮助!

0