Flash AS3 - removeChild() verwendet, um vollständig zu löschen Objekt?
Ich bin momentan dabei, ein asteroids-Spiel und in meiner main-Klasse, ich habe einige Schwierigkeiten Umgang mit den Kugeln, das Schiff feuert.
Alle Kugeln werden von der "Kugel" - Klasse und sind gespeichert in einem array namens "bullets" in der main-Klasse. Wenn Kugeln den Bildschirm zu verlassen, removeBullet(bulletID) in der main-Klasse aufgerufen wird.
private function removeBullet(id:int)
{
removeChild(bullets[id]);
bullets.splice(id);
}
In meiner Kugel Klasse, ich habe eine enterFrame-listener, der Spuren "stillHere". Also, sobald eine Kugel Hinzugefügt wird, um die Haupt-Bühne mit addChild, "stillHere" beginnt aufspringen in mein Bedienfeld "Ausgabe".
Mein problem ist, dass auch nach ich nenne die removeBullet, "stillHere" taucht immer wieder im Bedienfeld Ausgabe an, die mir sagt, dass das Objekt, das ich versucht zu löschen, klebt noch irgendwo in den Speicher.
Was kann ich tun, um es loszuwerden vollständig?
Ja, es funktioniert. Die Funktion erfolgreich entfernt die Kugel optisch aus dem Bildschirm zu.
kennen Sie Objekt-pools? Es gibt eine Reihe von Implementierungen bereit zu verwenden, und Sie können Ihre eigenen, auch für diese Art von Sachen (Kugeln).
InformationsquelleAutor Lebowski156 | 2011-02-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil Sie in ActionScript haben Sie keine direkte Kontrolle über, wenn Objekte entfernt werden.
Das wirkliche problem, das Sie haben, ist, dass Ihr Ereignis-Listener sind immer noch feuern. Sie können offensichtlich wird dieses Problem durch die Berufung
removeEventListener
wenn Sie gelöscht werden.Jedoch ein besserer Ansatz eine
ENTER_FRAME
- listener für das ganze Spiel. Es müssen individuell vorher alle Spiel-Elemente (Schiff, Asteroiden, Kugeln, Schmutz etc). Diese Methode entfernt alle Chancen, Sie zufällig zu vergessen, um Ereignis-Listener entfernen, und es macht auch den code übersichtlicher, da finden Sie die Reihenfolge der Elemente wird update innerhalb einer Zeit Schritt.Normalerweise habe ich eine
destroy
Funktion in meine temporäre Objekte, die etwas liest sich wie diese:Solange ich diese Funktion aufrufen, und dann entfernen Sie Verweise auf das Objekt, es ist in der Regel gesammelt.
Mein code hat nur sehr selten die Zuhörer auf die einzelnen Objekte, aus diesem Grund.
Ein Jahr und eine Hälfte später, vielen Dank für die gute Beratung auf der einzigen Ereignis-listener. Ich wusste gar nicht, dass es an der Zeit, aber im Nachhinein dies wäre schon die beste Wahl.
InformationsquelleAutor Chris Burt-Brown
Den Ereignis-listener selbst könnte sehr gut der Grund sein, es ist immer noch in Erinnerung. Das ist nicht ein guter Weg, um zu testen, ob etwas wurde Müll gesammelt werden oder nicht.
Auch, auch wenn das ein guter Weg, um zu überprüfen, ob ein Objekt wurde Müll gesammelt, die Sammlung ist nicht eine momentane Prozess. Der Flash Player läuft nur der gc, wenn es Sie braucht, mehr Speicher zuzuweisen, und nicht, dies zu tun.
Vorausgesetzt, Sie haben keine anderen Verweise auf das Kugel-Objekt neben der Anzeige Liste und die Kugeln array, das, was Sie getan haben, ist ausreichend, um zu ermöglichen, dass es Müll gesammelt.
EDIT : um die Frage Zu beantworten, ob es eine Möglichkeit zu beobachten, ob ein Objekt erfasst wurden...
Können Sie das Objekt als Schlüssel in einem schwach keyed-Wörterbuch.
Dann, Wann immer Sie wollen, um zu überprüfen, ob die Kugel noch vorhanden ist, verwenden Sie eine for...in-Schleife Durchlaufen, die Tasten
Weil eine schwach keyed Wörterbuch-Tasten zählen nicht als Referenzen für die Zwecke der garbage collection, das funktioniert.
Wenn Sie sehr besorgt über memory-leaks, könnten Sie schreiben ein Objekt-pool, in dem Sie statt alte Kugel-Objekte, die Sie entfernen Sie von der Bühne, und einfach wieder verwenden Sie immer und immer wieder. Auf diese Weise werden Sie nie ermöglichen, alle Kugeln zu werden, Müll gesammelt, sondern Sie werden wahrscheinlich nur immer eine kleine, begrenzte Anzahl von Kugeln (das ist die Anzahl der Kugeln, die der Benutzer nie sieht auf dem Bildschirm gleichzeitig zu einem bestimmten Zeitpunkt). Dies ist möglicherweise die beste Lösung für Sie, wie die Kugeln wohl einen kleinen Speicher-footprint und Sie bekommen den bonus nicht zwingen, Flash zu bereinigen Müll. Läuft der GC verursacht Leistungseinbußen während der Müll entfernt wird, so dass mit dieser Maßnahme zu tun, was Sie können, um zu verhindern, dass auch Sie benötigen, ist eine gute Sache.
Ich bin nur besorgt, dass Objekte, die gelöscht werden sollen, sind weiter ausgeführte Funktionen, die Auswirkungen auf das Hauptprogramm.
Ja, es gibt eine Runde über Art und Weise, dies zu tun. Ich werde mein edit beantworten, da es erfordert etwas besser formatieren, als der Kommentar der Platz erlaubt.
Vielen Dank für die Lektion + Tipps! Sehr geschätzt!
InformationsquelleAutor scriptocalypse