swift – SpriteKit场景过渡的好习惯

我正在使用SpriteKit和
Swift编写一个游戏并且遇到了内存问题.

我的游戏布局是这样的,GameViewController(UIViewController)在viewDidLoad屏幕中呈现第一个SKScene(levelChooserScene).这个场景只是显示一堆按钮.当用户选择按钮时,场景然后使用skView.presentScene转换到正确的场景,并且当关卡完成时,该场景然后转换回levelChooserScene并且游戏准备好让用户选择下一关卡.

问题是当转换回levelChooserScene时,为游戏场景分配的内存没有被释放,所以在选择了几个级别后,我开始接收内存错误.

我的设计在从SKScene过渡到SKScene时是否正确,或者我应该每次都返回到GameViewController,然后从那里过渡到下一个SKScene?

我在这里发现了一些帖子,说我应该在场景之间调用skView.presentScene(nil),但我对如何或在何处实现它感到困惑.

我只想从一个SKScene转换到另一个SKScene,并将从传出场景中使用的内存返回到系统.

这是我如何实现SKScene的一个例子:

class Level3: SKScene
{
   var explodingRockTimer = NSTimer()
   var blowingUpTheRocks = SKAction()

   override func didMoveToView(view: SKView)
   {
       NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: "dismissTheScene:", userInfo: nil, repeats: false)
       var wait = SKAction.waitForDuration(0.5)
       var run = SKAction.runBlock{
           // your code here ...
           self.explodeSomeRocks()
       }
       let runIt = SKAction.sequence([wait,run])
       self.runAction(SKAction.repeatActionForever(runIt), withKey: "blowingUpRocks")

       var dismissalWait = SKAction.waitForDuration(5.0)
       var dismissalRun = SKAction.runBlock{
           self.removeActionForKey("blowingUpRocks")
           self.dismissTheScene()

       }
       self.runAction(SKAction.sequence([dismissalWait,dismissalRun]))
   }

   func explodeSomeRocks()
   {
       println("Timer fired")
   }

   //MARK: - Dismiss back to the level selector
   func dismissTheScene()
   {
       let skView = self.view as SKView?
       var nextScene = SKScene()

       nextScene = LevelChooserScene()
       nextScene.size = skView!.bounds.size
       nextScene.scaleMode = .AspectFill
       var sceneTransition = SKTransition.fadeWithColor(UIColor.blackColor(), duration: 1.5) //WithDuration(2.0)
       //var sceneTransition = SKTransition.pushWithDirection(SKTransitionDirection.Down, duration: 0.75) //WithDuration(2.0)
       //var sceneTransition = SKTransition.crossFadeWithDuration(1.0)
       //var sceneTransition = SKTransition.doorwayWithDuration(1.0)
       sceneTransition.pausesOutgoingScene = true

       skView!.presentScene(nextScene, transition: sceneTransition)
   }
}

最佳答案 那导致我麻烦的是使用SKAction.repeatActionForever()调用发射器插入函数,每半秒插入粒子发射器5秒钟.

这个repeatAction显然没有被转换到另一个场景而被杀死,并且导致整个场景的内存被保留.我转而使用SKAction.repeatAction(),并指定应该触发的时间.当我转换到新场景时,场景现在返回其所有内存.

我不确定我是否理解这种行为.

点赞