Frage

Ich habe einen Ansichtscontroller, der drei SKSCENES als Kinder hat.

Wenn ich von einem zum anderen überwende, wird das alte SKScene nicht freigelassen.

Ich möchte, dass es gelöst wird, als wäre es nie da.

Beispiel:

Wenn ich die App zum ersten Mal lade, ist nur 1 SKScene sichtbar (sagen Sie, dass es 100 MB Speicher aufnimmt), dann wenden Sie sich zum anderen (100 MB mehr) und dann den dritten (300 MB Speicher).

Ich würde mit einem 300-MB-Speicher enden und ich möchte zu jeder Zeit 100 haben.

Wie kann ich das erreichen?

generasacodicetagpre.

Andere Tipps

Ich fange gerade mit Spritekit in Swift an und ich hatte das gleiche Problem: Meine "Intro" -Szene spielte eine Musik, die ich nach dem Übergang zur Hauptmenü-Szene aufhalten wollte, und ich fand, dass DEINIT ein guter Ort wäreUm den Avaudioplayer zu stellen, rufen Sie an, aber der Deinitializer wurde nie aufgerufen.

Nachdem ich umgesehen hatte, lernte ich, dass es an einigen starken Hinweisen auf die Szene sein kann, also habe ich geändert

generasacodicetagpre.

bis

generasacodicetagpre.

in meinem gameviewcontroller: uiviewcontroller und

generasacodicetagpre.

bis

generasacodicetagpre.

In der Szene, die ich zu erledigen wollte, und es funktionierte!Nachdem der Übergang abgeschlossen war, wurde die DEIIT-Methode aufgerufen.

Hoffentlich kann jemand erfahrener diese Antwort bearbeiten, um besser zu erklären, was genau hier stattgefunden hat.

edit: Meine vorherige Vorstellung von einem nstimer war irrelevant

Um sicherzustellen, dass dies ein Problem ist, das in dieser Szene isoliert ist, überschreiben Sie die DealLoc-Methoden aller Szenen, die Sie möglicherweise haben (einschließlich dieses). generasacodicetagpre.

Schauen Sie sich Ihre anderen Szenenübergänge an, sehen Sie, ob sie ordnungsgemäß geladen werden.Finden Sie die Unterschiede zwischen diesen Szenen.Dies hilft Ihnen, zu sehen, ob es sich um ein isoliertes Thema oder ein größeres Problem handelt.Sobald Sie das Problem behoben haben, stellen Sie sicher, dass Sie das DealLoc-Verfahren ausgeben oder entfernen, da es denjenigen überschreibt, der tatsächlich den Gedächtnis erledigt.Hoffentlich hilft das!

Es ist nichts falsch mit SKScene oder Skview, solange ich sehen kann.Stellen Sie sicher, dass die Szeneinstanz nirgendwo anders als in einem Block in einem Block Bezug genommen wird.Blöcke sind sehr wahrscheinlich, um ignoriert zu werden.

mehr über schwacher Bezugszeichen in einem Block: https://stackoverflow.com/a/17105368/571489

Soweit ich sehe, haben Sie einen Block, der die Szeneninstanz stark referenziert:

generasacodicetagpre.

dezember 2019 / swift 5

update:

mein layout:

Ich habe einen Single-View-Controller , der 2 skiews enthält , die jeder von ihnen ein eigenes einzigartiges SKScene hat, das gleichzeitig präsentiert wird. Ein Skview & sein SKScene ist die Hauptüberwartung, in der der Spieler-Charakter gerendert, kontrolliert, NPCs gerendert, Kameras-Tracking, den gesamten Shebang usw., & der andere Skview & sein SKScene zeigt die Mini-Karte der Overworld an. Sie können sich vorstellen, es gibt auch eine ganzzahlige SKSPRITENODE-SKSPRITENODE & LOT von ihnen, die immer eine Art Skonto- / Animation haben, die nicht stoppt (zum Beispiel schwankende Bäume). Meine SKSCENES enthalten sogar ihre eigenen Arrays, die auf bestimmte Gruppen von SKSPRITENODES, z. B. Zeichenknoten, Gebäudeknoten, Baumknoten, zeigen. Dies ist für schnelle Zugangs- und Bequemlichkeitszwecke. Außerdem habe ich ein paar Singletons, die entweder ein Array von Sktextures oder Zeichenmodellen usw. enthalten. Sie werden als Optimierung für den schnellen Datenzugriff aufbewahrt, anstatt jedes Mal von der Disc / Zugriff auf den Speicher zu lesen, wenn ich etwas brauche. Es gibt sogar Uikit-Elemente, die für das Spiel UI in der Ansichtssteuerung verwendet werden. Viele andere Objekte, wie z. B. meine Modelle, die Daten auf Charaktere, Gebäude, die gesamte Spielssitzung enthalten, haben alle irgendeine Art von Delegierten, die auf jemanden zeigen. Darüber hinaus ist die Codebase massiv.

Nach dem Beobachten des Gedächtnisses in der Debug-Sitzung fand ich den sicheren Weg heraus, um sicherzustellen, dass nichts zurückgehalten wird, ist, dass nichts sicher ist, dass das Folgende absolut sichergestellt ist:

Speicherhandhabung:

  • in Null für Szenenpräsentation weitergeben und das SKView-Eigentum / Zeiger auf Null auch
  • Entfernen Sie den gesamten Ansichtsregler-Primäransicht-Unteransichten
  • absolut set jeden delegate Sie müssen Null !!!!!!!!!!!!!!
  • Entfernen Sie alle Beobachter, wenn Sie über irgendeine
  • haben
  • Überall dort, wo Sie ein Array / Wörterbuch oder einen Zeiger auf eine Art von Objekt haben, die Sie erstellt haben, legen Sie es auf NIL / leer es
  • kritisch : Setzen Sie das gesamte oben genannte ein einzelne Funktion / ein einzelnes FUNKTION / ein und nennen Sie es richtig, bevor Sie die Ansichtssteuerungen ändern!

* HINWEIS: Wenn Sie 1 Anzeigencontroller für die gesamte App haben (Glückwunsch beim Quetschen von ALLES - Youz-Overlord-Squeezer), dann nicht alles, was darauf etabliert ist. Die vorherige Szene muss jedoch während der Präsentation noch auf NIL eingestellt werden.

So etwas wie dieser, wenn Sie zwischen View Controller springen:

generasacodicetagpre.

Wenn Sie nur verschiedene SKScene's mit einem einzigen Skview präsentieren, dann so etwas wie folgt:

generasacodicetagpre.

* HINWEIS: Vergessen Sie nicht, die Methode von SKScene DEINIT zu verwenden, um alles zu entfernen, was Sie nicht brauchen. Es ist eine Praxis, die ich die ganze Zeit für alle meine Klassen benutze, um alles zu entwirren, was ich vermisst hätte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top