Swift: Desalocar o GameScene após a transição para uma nova cena?

Então, eu li várias perguntas sobre isso, mas a maioria está no Objective-C e não encontrei nenhuma que resolva / responda diretamente. Eu sou novo na programação aqui, por favor, explique todas as sugestões realmente.

Eu preciso entender comodesalocar meu GameScene após o término do jogo. A razão pela qual eu preciso fazer isso é porque, após o término do jogo, faço a transição para um novo SKScene (a cena do game over) e quando faço a transição para o meu GameScene, o GameScene não é totalmente redefinido ou estou gerando um novo GameScene a cada vez .

Digo isso porque minha contagem de quadros por segundo diminui toda vez que eu jogo e volto para o GameScene, de modo que, se eu fizer isso o suficiente, não posso mais jogar o jogo. Isto é um problema.

Não entendo por que isso acontece porque, quando faço a transição para o meu game over, removo tudo do GameScene:

self.viewController!.performSegueWithIdentifier("goToGameOver", sender: nil)
            self.removeAllChildren()
            self.removeAllActions()
            self.scene?.removeFromParent()

Eu também li aqui:Após o fechamento do SKScene, a memória permanece alta que a remoção do SKView que contém um SKScene desaloca o SKScene; portanto, quando minhas cenas GameScene e game over são deixadas, eu removo AMBAS as visualizações de suas superviews assim:

override func viewDidDisappear(animated: Bool) {
        print("its gone")

        self.view.removeFromSuperview()

    }

Mas nada afeta a contagem decrescente de quadros por segundo e o jogo continua atrasado. Eu não entendo o que não estou fazendo e não sei dizer se a cena do jogo acabou ou não estou desalocando o GameScene.

Como desaloco o GameScene? O que mais eu deveria estar fazendo?

EDITAR:

A contagem de nós e a contagem de empates permanecem a mesma toda vez que faço a transição para o GameScene, de modo que isso não parece ser um problema. Eu tentei testar sedeinit foi chamado durante a transição entre cenas (eu não tinha umdeinit antes) usando isso na classe GameScene:

} //<**End of GAMESCENE**

    deinit {
        print("Deinit was called")
    } 

E nada é impresso tãodeinit não está sendo chamado.

EDIT 2:

@alex_p Aqui está o que eu tenho no meu 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 eu chamo esse método do meu GameScene assim:

self.viewController.nextSceneAction(self)

Copiei o seu exatamente, mas estou recebendo o errounexpectedly found nil while unwrapping an Optional value na linha comentada acima. Deinit em não ser chamado.

questionAnswers(1)

yourAnswerToTheQuestion