В Javascript я должен удалить экземпляры предыдущего уровня после загрузки нового? - PullRequest
6 голосов
/ 05 марта 2012

Я сделал HTML5-игру, которая состоит из множества маленьких уровней.Когда игрок добирается до дверей, загружается другой уровень.Когда уровень загружается, он в основном просто устанавливает все массивы экземпляров на [], а затем помещает в них вещи, создавая новые экземпляры вещей, например:

enemies = [] //this has previously been full of pointers from the old level
for (i = 0; i < n_enemies; i ++)
    enemies.push(new Enemy());

Но это дошло до моегообратите внимание, что просто установка массива, полного указателей на [], на самом деле не удаляет экземпляры!Итак, делает ли JavaScript это автоматически?Или я должен delete каждый экземпляр сам?

Ответы [ 4 ]

3 голосов
/ 05 марта 2012

Если на объекты, которые были в массиве, больше нет ссылок из любого места, то они будут собираться мусором.Нет спецификации, в которой указано, когда это произойдет, но это должно произойти вскоре после их удаления из массива.

Это не должно приводить к утечке памяти.

2 голосов
/ 05 марта 2012

Я не очень разбираюсь в разработке игр, но обычно в Javascript очистка массива выполняется следующим образом, и это хорошая практика

enemies.length = 0;

отметьте post

1 голос
/ 05 марта 2012

В JavaScript нет команды free, поэтому вы не можете "освободить" память самостоятельно.Все, что вы можете сделать, это: убить все ссылки (указатели) на некоторый объект.В конце концов, сборщик мусора будет искать объекты, которые больше никому не видны.

Или, скорее: GC в конечном итоге соберет всю память, которая все еще доступна, и забудет об остальном.Вот почему только живые объекты стоят в среде GC.

Но есть одна загвоздка: GC не сообщает объектам, что они мертвы.Поэтому, если ваш объект Enemy нуждается в некоторой очистке, вы должны сделать это вручную.

1 голос
/ 05 марта 2012

Это как любой другой язык программирования. Если есть ссылка на объект, она не будет удалена.

, например

enemies = [];
enemy = new Enemy();
enemies.push(enemy);
enemies = [];

Если вы не создадите ссылку на объект после опустошения врагов, вражеский объект также будет удален

enemies.push(new Enemy());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...