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()とどのように異なりますか?
この件についてのご意見をお待ちしております。
キルとデストロイの違い
Kill
はレンダリングを停止することになっていますが、オブジェクトはまだ存在しています。再利用可能なオブジェクトを作成する場合に適しています。実際にオブジェクトを再度作成するコストをかけずに、オブジェクトを再度作成できます。
Destroy
は、オブジェクトとそれに関連するすべてのものを削除する必要があります。オブジェクトをガベージコレクターに送信する場合に使用します。
テキストなどの一部のオブジェクトでは、kill
を使用できず、destroy
のみを使用できることに注意してください。
参照: http://www.html5gamedevs.com/topic/1721-how-to-remove-text/#entry12347
@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では必要ありません)