Skallocate SKScene nach Übergang zu einem anderen SKScene in Spritekit
-
21-12-2019 - |
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.Lösung
Ein ähnliches Problem wurde von der Person konfrontiert, die dies gefragt hat Frage .
Wenn er gefragt wurde, ob er es lösen konnte, sagten sie:
Ja, ich tat, es gab nichts, was ich von der Szene tun konnte oder Sprite-Kit für diese Angelegenheit, ich musste einfach die Szene entfernen und Die Ansicht, die es vollständig aus der übergeordneten Ansicht enthielt, schneide alle seine Bindungen an die anderen Teile des Systems, damit der Speicher sein kann auch so gut behandelt.
Sie sollten separate Ansichten für jede Ihrer Szene und den Übergang zwischen diesen Ansichten verwenden. Sie können diese Schritte folgen, um es natürlich aussehen zu lassen:
1 - An dem Punkt, an dem Sie von einer Szene zum anderen übergehen möchten, nehmen Sie einen Schnappschuss der Szene mit dem folgenden Code:
generasacodicetagpre.dann fügen Sie dieses Bild als Unteransicht des Skview der aktuellen Szene hinzu und entfernen Sie die Szene.
2 - Initialisieren Sie die neue Szene auf einer anderen Ansicht und den Übergang zwischen den beiden Ansichten mithilfe von UIVIEW-Animationen.
3 - Entfernen Sie die erste Ansicht von seinem SuperView.
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
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