17

我无法在 Phaser 中销毁 Sprite。

我有一个 JavaScript 对象,我们称之为 Block。Block 有一个 sprite 属性,设置如下:

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

在我的代码中的某个点,Block 被两个不同的数组引用:

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。我担心的是,如果我现在将 destroy[0] 设置为 null,那个 sprite 对象会发生什么?

它会漂浮还是会自动清理?我应该先以某种方式破坏 Block 对象吗?此外,如果destroy() 没有将引用归零,它与kill() 有何不同?

对此事的任何想法将不胜感激。

4

2 回答 2

22

杀戮与毁灭的区别

Kill应该停止渲染,但对象仍然存在。如果你想制作一个可重用的对象,那就太好了。您可以再次创建对象,而无需再次实际创建对象。

Destroy应该删除对象以及与之相关的所有内容。当您想将对象发送到垃圾收集器时,您可以使用它。

请注意,对于一些像文本这样的对象,你不能使用kill,你只能使用destroy

参考: http ://www.html5gamedevs.com/topic/1721-how-to-remove-text/#entry12347

于 2014-07-18T07:54:04.703 回答
2

@ibnu 是正确的。Destroy核对对象,同时kill停止渲染。但是,您的问题与内存泄漏和 GC 有关。我不是 GC 专业人士,但这就是我认为正在发生的事情。

//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's 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 destroy 方法只从对象中删除 Phaser 特定的属性。JS 负责通用对象 Garbage Collection。该对象正在转义,因为您在范围内仍然有有效的引用。

通过从范围中删除引用destroy[0].sprite = null或等待下一个状态更改范围来解决此问题(假设destroy 不是静态变量)。您不必自己管理内存资源,JS!= C。只要确保您不会跨不同范围泄漏变量。

什么是 JavaScript 垃圾回收?(虽然我认为该delete命令不再推荐用于 GC,但在 Phaser 中肯定没有必要)

于 2016-08-29T17:29:11.827 回答