Уничтожение спрайтов в Phaser

У меня возникли проблемы с уничтожением Sprites в Phaser.

У меня есть объект JavaScript, позвольте ему заблокировать его. Блок имеет свойство sprite, которое устанавливается следующим образом:

this.sprite = this.game.add.sprite(this.x, this.y, 'blocks', this.color);

В какой-то момент моего кода на блок ссылаются два разных массива:

square[0] = Block;
destroy[0] = Block;

В определенном цикле Update() мне нужно уничтожить спрайт, поэтому я использую следующий код:

square[0].sprite.destroy(true); //Destroy the sprite.
square[0] = null; //Remove the reference.

В следующий цикл Update(), когда я смотрю на destroy [0], я ожидаю увидеть:

destroy[0].sprite: null

Однако я вижу:

destroy[0].sprite: b.Sprite

С изменением свойств и значением false. Мое беспокойство заключается в том, что если я должен теперь уничтожить [0] до нуля, что произойдет с этим объектом спрайта?

Будет ли он просто плавать или будет автоматически очищаться? Должен ли я сначала уничтожить объект Block? Кроме того, если destroy() не обнуляет ссылку, как она отличается от kill()?

Будем очень благодарны за любые мысли по этому поводу.

Ответы

Ответ 1

Разница между Kill и Destroy

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

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

Обратите внимание, что для некоторых объектов, таких как текст, вы не можете использовать Kill, вы можете использовать только Destroy

Ссылка: http://www.html5gamedevs.com/topic/1721-how-to-remove-text/#entry12347

Ответ 2

@ibnu правильно. Destroy уничтожает объект, а kill останавливает рендеринг. Однако ваш вопрос связан с утечками памяти и GC. Я не GC pro, но вот то, что я думаю, происходит.

//create an object
this.sprite = this.game.add.sprite(this.x, this.y, 'blocks', this.color);
//create additional references to the object
square[0] = Block;
destroy[0] = Block;
//destroy the object via Phaser call. Remove 1/2 reference
square[0].sprite.destroy(true); //Destroy the sprite.
square[0] = null; //Remove the reference.

Но destroy[0].sprite по-прежнему содержит ссылку на ваш "разрушенный" спрайт. this.sprite, вероятно, тоже. Это потому, что метод уничтожения Phaser удаляет только определенные свойства Phaser из объекта. JS отвечает за общий сбор мусора.. Объект ускользает из-за того, что у вас все еще есть допустимые ссылки в области.

Исправить эту проблему, удалив ссылку из области destroy[0].sprite = null или ожидая, когда следующее состояние изменит область действия (при условии, что destroy не является статическим var). Вам не нужно самостоятельно управлять ресурсами памяти, JS!= C. Просто убедитесь, что вы не используете leak переменные в разных областях.

Что такое сборка мусора JavaScript? (хотя я не думаю, что команда delete рекомендуется для GC больше, она, безусловно, не нужна в Phaser)