2016-08-23 5 views
0

Ich arbeite an einem Spritekit-Spiel, das sowohl ViewControllers als auch eine SpriteKit-Szene verwendet. Grundsätzlich besteht die Struktur der Anwendung darin, dass Sie in ein Menü (View-Controller) auftauchen, das Sie durch einen Button modal zum Spiel (View-Controller) überleitet, das den GameScene (Skscene) lädt.Warum habe ich eine massive Verzögerung, nachdem ich meine Spritekit-Szene zum vierten Mal ausgeführt habe?

Wenn Sie das Spiel verlieren, werden Sie über einen modalen Übergang zu einem Spiel über den Bildschirm (View-Controller) geschickt: gameVC?.performSegueWithIdentifier("goToGameOver", sender: gameVC) Dieser Abschnitt befindet sich im GameScene und scene.gameVC = self befindet sich im Game View Controller. gameVC wird in GameScene als var gameVC: UIViewController? initialisiert. Im Spiel über Bildschirm können Sie entweder zurück zum Menü gehen oder Sie können mit button-initialisierten Modal-Segues erneut spielen (zurück zum Game View Controller).

Das Problem tritt auf, wenn Sie mehr als vier Mal zum GameScene gehen. Zum fünften Mal, wenn GameScene geöffnet wird (entweder vom Menü vc oder vom Spiel über vc), bleibt das Spiel unglaublich zurück. Der fps-Counter unten rechts auf dem Bildschirm sagt, dass das Spiel 1,5 fps produziert.

Ich glaube, das Problem ist, dass die GameViewController & der GameScene nicht korrekt abgewiesen werden (die Speicherauslastung der App erhöht jedes Mal, wenn die App zu GameScene bewegt), aber ich weiß nicht, wie Sie sie korrekt ablehnen. Ich habe

self.removeFromParent() 
self.view?.presentScene(nil) 

als eine Möglichkeit, zu versuchen, die GameScene direkt vor und direkt nach dem Übergang zu Gameover Code ausgeführt wird, aber ohne Erfolg zu entlassen. Ich dachte auch daran, sich zu entspannen, aber ich kann mich nicht auf einen View-Controller (Spiel vorbei) entspannen, auf dem ich noch nicht war. Ich habe keine Ideen mehr, und das ist ein Game-breaking-Bug. Ich würde wirklich etwas Hilfe schätzen. Vielen Dank.

+0

Wahrscheinlich, weil nichts jemals stirbt, müssen Sie stark behalten Zyklen prüfen, die passiert werden kann. Deklarieren Sie 'deinit' in Ihren Klassendateien und geben Sie eine print-Anweisung ein, um sicherzustellen, dass sie aufgerufen werden – Knight0fDragon

+0

Bevor ich vom Spiel zum Spiel übergehe, mache ich' self.removeAllChildren() 'und' self.removeAllActions() '- Beantwortet dies die starken Retain-Zyklen? – Comrod33

+0

nein, das wird überhaupt nicht helfen, da die mit dem Elternteil sterben sollten, etwas in sich hält sich selbst – Knight0fDragon

Antwort

3

Sie tun im Wesentlichen, was Sie in SpriteKit nicht tun sollten. Die Verwendung mehrerer Ansichtscontroller wird in SpriteKit nicht empfohlen.

Es ist besser, nur 1 View-Controller zu haben und mehrere Szenen (Menüszene, Spielszene) zu haben.

Sie sollten diese Frage lesen.

Swift: How to handle view controllers for my game

0

Hey ich hatte exakt das gleiche Problem, das Sie haben. Ich habe diese Codezeile am Ende meiner Szene platziert, um zu meinem Viewcontroller zurückzukehren, und der Lag ist weg. !

self.viewController .dismissViewControllerAnimated (true, Fertigstellung: nil)

Verwandte Themen