2012-03-05 5 views
6

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

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 каждый экземпляр сам?

ответ

3

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

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

+2

Также 'delete' определяется только для свойств объектов, поэтому javascript даже не содержит способа удаления переменных массива. Вы должны просто предположить, что js-движок позаботится о сборке мусора после удаления всех ссылок. – wheresrhys

+0

wheresrhys - Элементы массива - это просто свойства с числовыми именами. Удалить также работает над ними (например, 'delete array ['0']' удаляет первый элемент массива, начинающийся с нуля), но, как говорит Jivings, здесь это необязательно. – RobG

+0

@RobG - Я, вероятно, должен был быть более ясным - с помощью «переменных массива» я имел в виду переменные, которые являются массивами, а не примитивными значениями, хранящимися в массивах. – wheresrhys

1

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

например.

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

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

enemies.push(new Enemy()); 
+0

* любой другой ** сборщик мусора ** язык программирования. Если вы работаете на языке, отличном от GC'd, вам нужно будет самостоятельно распределить память. – Davy8

2

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

enemies.length = 0; 

проверить это post

+0

+1 Это работает точно так же, как установка массива на '[]'. – Jivings

+0

Я никогда не слышал об этом раньше. Кажется, что он работает (только что протестирован в Chrome), но любая ссылка на это является хорошей практикой? – Davy8

+0

ОК, но я считаю, что это должен быть комментарий, так как он не отвечает на вопрос напрямую. Благодарю. Я тестировал его также в Chrome, он работает, но я нигде не читал об этом. Если это «правильный» способ, почему люди больше не говорят об этом? – corazza

1

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

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

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

+0

Нет? Я уверен, что есть, это ключевое слово, и я читаю об этом где-то! +1 для всей полезной информации. – corazza

+1

@Bane [Оператор удаления] (https://developer.mozilla.org/en/JavaScript/Reference/Operators/delete) – Jivings

+0

Aha! Это прояснилось. – corazza

 Смежные вопросы

  • Нет связанных вопросов^_^