Quindi ho letto diverse domande su questo argomento ma la maggior parte si trova in Objective-C e non ho trovato alcun indirizzo/risposta direttamente. Sono nuovo nella programmazione qui, quindi per favore spiegate ogni suggerimento in modo approfondito.Swift: Deallocate GameScene dopo il passaggio a una nuova scena?
Ho bisogno di capire come deallocate il mio GameScene dopo il game over è stato raggiunto. La ragione per cui ho bisogno di farlo è che dopo il game over, passo a un nuovo SKScene (il gioco sulla scena) e quando torno al GameScene, GameScene non viene resettato completamente o sto generando un nuovo GameScene ogni volta .
Dico questo perché il mio numero di fotogrammi al secondo diminuisce ogni volta che finisco la partita e ritorno al GameScene, in modo che se lo faccio abbastanza volte non posso nemmeno più giocare. Questo è un problema.
non capisco il motivo per cui questo accade perché quando ho transizione verso il mio gioco su scena, tolgo tutto, dalla mia GameScene:
self.viewController!.performSegueWithIdentifier("goToGameOver", sender: nil)
self.removeAllChildren()
self.removeAllActions()
self.scene?.removeFromParent()
Ho letto anche qui: After Closing SKScene, Memory Remains High che la rimozione del SKView che contiene uno SKScene dealloca lo SKScene, così quando sia il mio GameScene e gioco sopra le scene sono di sinistra, tolgo entrambe le viste dai loro superviews come questo:
override func viewDidDisappear(animated: Bool) {
print("its gone")
self.view.removeFromSuperview()
}
Ma niente ha alcun effetto sulle cornici decrescenti al secondo conteggio e il gioco continua a laggin g. Non capisco cosa non sto facendo e non riesco a capire se il problema del game over è il problema o semplicemente non sto rilasciando GameScene.
Come rilasciare il GameScene? Che altro dovrei fare?
EDIT:
mio numero di nodi e disegna conteggio rimangono circa lo stesso ogni volta che la transizione torna a GameScene, in modo che non sembra essere un problema. Ho provato a testare se deinit
è stato chiamato durante le transizioni tra le scene (non ho avuto un deinit
prima) utilizzando questo all'interno della classe GameScene:
} //<**End of GAMESCENE**
deinit {
print("Deinit was called")
}
E nulla viene stampato in modo deinit
non viene chiamato.
EDIT 2:
@alex_p Ecco quello che ho nel mio GameViewController-
class GameViewController: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver {
var scene1: GameScene?
var scene2: GameScene?
var skView: SKView?
// Action to present next Scene
@IBAction func nextSceneAction(sender: AnyObject) {
print("Next scene")
// Create new GameScene object
scene2 = GameScene(fileNamed:"GameScene")
// Present scene2 object that replace the scene1 object
skView!.presentScene(scene2) //ERROR ON THIS LINE
scene1 = nil
}
E chiamare questo metodo dal mio GameScene in questo modo:
self.viewController.nextSceneAction(self)
ho copiato la vostra esattamente ma sto ricevendo l'errore unexpectedly found nil while unwrapping an Optional value
sulla linea commentata sopra. Deinitare nel non essere chiamato.
Si può iniziare con deinit imperativo di scene. Verifica se viene chiamato durante la transizione tra le scene. Sarebbe un inizio. Se il deinit non viene chiamato, è necessario cercare i possibili cicli di mantenimento. Controlla anche i nodi e conta il conteggio. Puoi aggiornare la tua domanda con quei dati? – Whirlwind
Appena aggiornato. Non penso che il deinit venga chiamato così come si fa a cercare un ciclo di conservazione? – skyguy
Sì, probabilmente hai alcuni forti riferimenti alla scena ... Per iniziare dai un'occhiata a questo: http://stackoverflow.com/questions/19251337/ios-7-sprite-kit-freeing-up-memory/19253739 # 19253739. Dopo il check out, termini "auto non proprietario" e "auto debole" http://stackoverflow.com/questions/24320347/shall-we-always-use-unowned-self-inside-closure-in-swift/24320474#24320474 Spero che questo ti porti da qualche parte. – Whirlwind