2015-06-17 12 views
10

Ho creato un gioco semplice con SpriteKit, tuttavia ogni volta che eseguo il gioco, l'utilizzo della memoria nel simulatore aumenta di circa 30 MB, ma non diminuisce mai quando il gioco è finito.In modo rapido, come riportare la memoria alla normalità dopo la rimozione di SKScene?

Quando eseguo il gioco più di dieci volte, il simulatore rallenta e rallenta.

In questo semplice gioco ho due controllori e un gamescene:

MainController chiama GameViewController tramite un pulsante innescato

In GameViewController, gamescene viene inizializzato in questo modo:

class GameViewController: UIViewController 
{ 

    var skView:SKView! 

    var scene:GameScene! 

    override func viewDidLoad() { 

     super.viewDidLoad() 
     scene = GameScene(size: view.bounds.size) 
     skView = view as SKView 
     skView.ignoresSiblingOrder = true 
     scene.scaleMode = .ResizeFill 

     scene.viewController = self 
     skView.presentScene(scene) 

    } 

//with a prepareForSegue deinitialises the scene and skview: 
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

    if segue.identifier == "GameFinished"{ 

     scene.removeAllActions() 
     scene.removeAllChildren() 
     scene.removeFromParent() 
     scene = nil 

     skView.presentScene(nil) 
     skView = nil 

     let target = segue.destinationViewController as MainController 
    } 
    } 
} 

Nel GameScene, viewController è una proprietà

var viewController:GameViewController? = GameViewController() 

la segue viene attivato con questo:

Ho anche provato a mettere rimuovere metodi in deinit in GameScene:

deinit{ 
    self.removeAllActions() 
    self.removeAllChildren() 
    } 

Ancora non funzionerebbe

+0

Esegui strumenti e verifica la presenza di una perdita di memoria. https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/InstrumentsQuickStart/InstrumentsQuickStart.html – sangony

+0

Ho avuto questo stesso problema non 30 minuti fa. Si è verificato che avevo una perdita di memoria, quindi ho impostato le proprietà di visualizzazione e di scena su deboli, rimosso il problema di perdita, ma non sono sicuro che sia il modo migliore per farlo. –

risposta

7

tuo GameViewController ha un forte riferimento al tuo GameScene. E il tuo GameScene aveva un forte riferimento al tuo GameViewController. Questo porta a un forte ciclo di riferimento, il che significa che nessuno dei due oggetti sarà deallocato.

È necessario dichiarare la proprietà viewController nel proprio GameScene come debole.

weak var viewController:GameViewController? = GameViewController() 
+0

OK, ho usato dismissViewControllerAnimated invece di performSegueWithIdentifier una volta terminato il gioco, senza i metodi removeAllChildren e removeAllActions, sembra "funzionato" ... La memoria aumenta con una quantità molto piccola ogni volta che il gioco viene lanciato ... Come è potuto accadere? ? –

+0

@FanZhang Potresti spiegare come hai fatto?Sto sperimentando questo stesso esatto problema per un po 'di tempo e spero davvero in una soluzione ... – DHShah01

+0

Niente di speciale, basta istanziare il GameViewController in GameScene: weak var viewController: GameViewController? = GameViewController() ed esegui self.viewController? .dismissViewControllerAnimated (true, completion: nil) quando il gioco è finito. –

0

Utilizzando Swift 3, Xcode 8 e iOS 10. Dopo aver evitato riferimenti forti, curato SKTextures, ecc livello di memoria non ha recuperato dopo che respinge la scena e tornare al "menu" viewController. stavo usando:

override func sceneDidLoad() {...} 

Questo è disponibile in iOS 10 ma volevo iOS 8 & 9 compatibilità è per questo che ho cambiata in più vecchio:

override func didMove(to view: SKView) {...} 

Accanto ottenere compatibile con iOS meno recenti versioni, si scopre che il livello di memoria diminuisce dopo aver chiuso la scena. Questa è stata una sorpresa. Mi mancano probabilmente alcune perdite ma sta funzionando per me. Spero che aiuti qualcuno.

+0

Puoi creare un esempio minimo verificabile per provare questa perdita? – Whirlwind

+0

@Whirlwind mi dispiace, ci ho provato, ma non sono in grado di farlo. Lo strumento Leaks mostra un paio di perdite relative a "SKAction.animate" che non ho ancora risolto. Pensavo che questo fosse il problema, ma ora, passando a "didMove", il problema della memoria non c'è più. – user2888102

Problemi correlati