Swift:转换到新场景后解除分配GameScene?

时间:2015-10-31 14:59:27

标签: swift sprite-kit

所以我已经阅读了几个有关此问题的问题,但大多数是在Objective-C中,我还没有找到任何直接解决/回答的问题。 我是新手编程,所以请彻底解释任何建议。

我需要了解如何在游戏结束后取消分配我的GameScene。我需要这样做的原因是因为在比赛结束后,我转换到新的SKScene(场景中的游戏),当我转换回我的GameScene时,GameScene都没有完全重置或者我正在生成一个新的GameScene每一次。

我这样说是因为每次游戏结束时我的每秒帧数都会下降并转换回GameScene,所以如果我做足够多次,我甚至不能再玩游戏了。这是一个问题。

我不明白为什么会发生这种情况,因为当我在场景中过渡到我的游戏时,我会删除GameScene中的所有内容:

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

我还在这里阅读:After Closing SKScene, Memory Remains High删除包含SKScene的SKView会解除分配SKScene,所以当我的GameScene和场景游戏都离开时,我会从他们的超级视图中删除两个视图:

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

        self.view.removeFromSuperview()

    }

但是对于每秒减少的帧数并没有任何影响,游戏仍然滞后。我不明白我没做什么,无法判断场景中的游戏是否是问题,或者我只是不解除GameScene的解除分配。

如何取消分配GameScene?我还应该做什么?

编辑:

每次转换回GameScene时,我的节点数和绘制计数大致相同,所以这似乎不是问题。我尝试在GameScene类中使用它来测试在场景之间转换时是否调用了deinit(之前我没有deinit):

} //<**End of GAMESCENE**

    deinit {
        print("Deinit was called")
    } 

没有打印任何内容,因此deinit没有被调用。

编辑2:

@alex_p这是我在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
    }

我从我的GameScene这样称呼这个方法:

self.viewController.nextSceneAction(self)

我完全复制了你的,但我在上面评论的行上收到了错误unexpectedly found nil while unwrapping an Optional value。在没有被召唤的情况下离开。

1 个答案:

答案 0 :(得分:0)

在我的项目中,我使用了以下机制并且运行良好。我的所有场景SKScene对象都是可选变量。当我需要显示新场景时,我创建它并出现在SKView。当我需要显示新场景时,我将前一个对象场景对象设置为nil,这会立即将引用计数减少1,因此此时没有一个对象不使用我的场景,引用计数变为零并且场景被删除。

SKScene对象是普通的类对象,ARC与所有引用类型对象一样使用它们。您只需要监视场景的引用数量。所有这些都完成了我在deinit对象<{p>}的SKScene开始的各种资源

简单的例子:

UIViewController,我们有GameScene的可选对象:

class GameViewController: UIViewController {
    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)
        scene = nil
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Create GameScene object
        scene = GameScene(fileNamed:"GameScene")
        skView = (self.view as! SKView)
        skView!.showsFPS = true
        skView!.showsNodeCount = true

        skView!.ignoresSiblingOrder = true

        scene!.scaleMode = .AspectFill

        // Present current scene
        skView!.presentScene(scene)
    }
}

GameScene deinit打印一些文字,以表明该对象将被删除:

class GameScene: SKScene {
   ...

    deinit {
        print("Deinit scene")
    }
}

按下nextSceneAction按钮后调试输出:

  

下一个场景

     

Deinit scene