web-dev-qa-db-ja.com

Phaserでスプライトを破壊する

Phaserでスプライトを破壊するのに問題があります。

JavaScriptオブジェクトがあります。これをBlockと呼びましょう。ブロックにはSpriteプロパティがあり、次のように設定されます。

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

私のコードのある時点で、Blockは2つの異なる配列によって参照されます。

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()が参照をnullにしていない場合、kill()とどのように異なりますか?

この件についてのご意見をお待ちしております。

17
alexania

キルとデストロイの違い

Killはレンダリングを停止することになっていますが、オブジェクトはまだ存在しています。再利用可能なオブジェクトを作成する場合に適しています。実際にオブジェクトを再度作成するコストをかけずに、オブジェクトを再度作成できます。

Destroyは、オブジェクトとそれに関連するすべてのものを削除する必要があります。オブジェクトをガベージコレクターに送信する場合に使用します。

テキストなどの一部のオブジェクトでは、killを使用できず、destroyのみを使用できることに注意してください。

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

22
Ibnu Triyono

@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はジェネリックオブジェクトのガベージコレクションを担当しています 。スコープ内にまだ有効な参照があるため、オブジェクトはそれをエスケープしています。

スコープから参照を削除して、この問題を修正しますdestroy[0].Sprite = nullまたは、次の状態がスコープを変更するのを待つことによって(destroyが静的変数ではないと仮定)。 JS!= C、メモリリソースを自分で管理する必要はありません。異なるスコープ間で変数を リーク しないように注意してください。

JavaScriptガベージコレクションとは何ですか?deleteコマンドはGCに推奨されなくなったと思いますが、Phaserでは必要ありません)

2
James L.