我正在使用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
}`
完美地解决了我的问题。