2014-07-05 6 views
14

Ich habe Probleme, Sprites in Phaser zu zerstören.Zerstöre Sprites in Phaser

Ich habe ein JavaScript-Objekt, nennen wir es Block. Block hat eine Sprite-Eigenschaft, die wie so gesetzt wird:

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

An einem bestimmten Punkt in meinem Code, Block wird durch zwei verschiedene Arrays referenziert:

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

auf einem bestimmtes Update() Zyklus, ich brauche das Sprite zu zerstören, so verwende ich den folgenden Code:

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

auf dem nächsten Update() Zyklus, wenn ich zerstören suchen [0], ich erwarten würde, um zu sehen:

destroy[0].sprite: null 

aber was ich sehe ist:

destroy[0].sprite: b.Sprite 

Mit den Eigenschaften nur Verzug geraten und auf false gesetzt. Meine Sorge ist, wenn ich jetzt zerstören [0] auf Null setzen würde, was wird mit diesem Sprite-Objekt passieren?

Wird es einfach herumschweben oder wird es automatisch gereinigt? Soll ich das Block-Objekt zuerst auf irgendeine Weise zerstören? Auch, wenn der Verweis durch die destroy() nicht aufgehoben wird, wie unterscheidet es sich von kill()?

Alle Gedanken zu der Sache werden sehr geschätzt.

+2

Der Garbage Collector it up reinigen, wenn es keinen Hinweis darauf ist. – Oriol

+0

Wenn Sie gefunden haben, was Sie gesucht haben, akzeptieren Sie bitte eine Antwort. –

Antwort

19

Unterschied zwischen Töten und Zerstören

Kill sollte Rendering stoppen, aber das Objekt noch existiert. Es ist gut, wenn Sie ein wiederverwendbares Objekt erstellen möchten. Sie könnten das Objekt erneut erstellen, ohne die Kosten für die eigentliche Erstellung des Objekts zu berechnen.

Destroy sollte das Objekt und alles, was damit zu tun. Sie verwenden dies, wenn Sie das Objekt an den Garbage Collector senden möchten.

Bitte beachten Sie, dass für einige Objekte wie Text, können Sie nicht kill verwenden, können Sie nur destroy

Referenz verwenden können: http://www.html5gamedevs.com/topic/1721-how-to-remove-text/#entry12347

+0

Wie kann ich Objekt mit Garbage Collector manipulieren? –

0

@ibnu korrekt ist. Destroy nuke das Objekt, während kill das Rendern anhält. Ihre Frage bezieht sich jedoch auf Speicherlecks und GC. Ich bin kein GC-Profi, aber hier passiert, was ich denke.

//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. 

Aber destroy[0].sprite hält immer noch einen Verweis auf Ihre "zerstört" Sprite. wahrscheinlich auch. Das liegt daran, dass die Methode Phaser destroy nur Phaser-spezifische Eigenschaften aus dem Objekt entfernt. JS is in charge of generic object Garbage Collection. Das Objekt entkommt, weil Sie immer noch gültige Referenzen im Bereich haben.

Korrigieren Sie dieses Problem, indem Sie die Referenz aus dem Bereich destroy[0].sprite = null entfernen oder warten, bis der nächste Status den Bereich ändert (unter der Annahme, dass es sich bei destroy nicht um eine statische Variable handelt).Sie müssen die Speicherressourcen nicht selbst verwalten, JS! = C. Stellen Sie sicher, dass Sie keine leak Variablen in verschiedenen Bereichen verwenden.

What is JavaScript garbage collection? (obwohl ich nicht glaube, der delete Befehl für GC mehr empfohlen wird, ist es sicherlich nicht nötig, in Phaser)