主场景重启后SpriteKit游戏丢失FPS

时间:2017-06-25 00:25:33

标签: ios swift xcode sprite-kit

我正在使用Sprite Kit创建一个游戏,我有一个问题,即在我的主要场景的每次重复时游戏都会慢慢失去fps。

我曾尝试使用Xcode的乐器,但是没有接近我问题的根源。

  

这是我结束游戏并呈现场景游戏的功能:

func endGame(){

    let endGameScene = SKScene(fileNamed: "EndGameScene" ) as! EndGameScene
    endGameScene.score = score




    //let transition = SKTransition.push(with: SKTransitionDirection.right, duration: 0.5)
    self.view?.presentScene(endGameScene)

    transitionNode = SKSpriteNode(color: UIColor.white, size: self.frame.size)
    transitionNode.zPosition = 5
    self.addChild(transitionNode)
    transitionNode.run(SKAction.fadeIn(withDuration: 0.3))




    gameOver = true


}
  

这是我演示游戏场景的功能   点击重启按钮:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    let touch = touches.first

    if let location = touch?.location(in: self) {
        let nodeArray = self.nodes(at: location)

        if(nodeArray.first?.name == "replayButton"){


            self.view?.presentScene(gameScene)

            transitionNode = SKSpriteNode(color: UIColor.white, size: self.frame.size)
            transitionNode.zPosition = 5
            self.addChild(transitionNode)
            transitionNode.run(SKAction.fadeIn(withDuration: 0.3))

我还使用乐器检查了泄漏,但没有出现。同样,最重的堆栈跟踪日志显示我的类文件中没有花费最多时间的区域,如下所示:(由于某种原因无法上传图像,所以这里是链接)

https://puu.sh/wtrMZ/1bb8c6542a.png

游戏以固定的60 fps开始,然后降至58,然后降至57,然后降至55,然后降至54,依此类推。我尝试了 deinit {} 测试,场景解除分配。我使用调试器来检查我的内存使用情况,虽然它确实略微上升,但它一次只能突破50 MB。我也不认为这是删除未使用节点的问题,因为我确保在每个实例中删除它们,但我可能是错的:

  

DEINIT

deinit {

    self.removeAllChildren()
}

我真的很难过,因为我甚至不知道如何开始解决这个问题。非常感谢任何帮助或建设性的批评,谢谢。

修改

我从未在Game Scene类中使两个主要计时器失效。我只是在我的endGame函数中使它们失效:

`func endGame(){

    let endGameScene = SKScene(fileNamed: "EndGameScene" ) as! EndGameScene
    endGameScene.score = score




    //let transition = SKTransition.push(with: SKTransitionDirection.right, duration: 0.5)
    self.view?.presentScene(endGameScene)

    transitionNode = SKSpriteNode(color: UIColor.white, size: self.frame.size)
    transitionNode.zPosition = 5
    self.addChild(transitionNode)
    transitionNode.run(SKAction.fadeIn(withDuration: 0.3))

    pillarTimer.invalidate()
    durationTimer.invalidate()



    gameOver = true


}`

完美地解决了我的问题。

0 个答案:

没有答案