用SKScene呈现ViewController时停止

编辑:好的,所以这甚至发生在一个空的SpriteKit场景! 这里有什么可能是错的? 为什么iOS需要2秒才能显示SpriteKit场景?

编辑2:我第一次点击标签栏来显示视图控制器与SKScene立即显示,但下一次我尝试导航回到这个视图控制器它将需要2秒钟显示!

我有一个标签栏控制器在我的应用程序与多个不同的viewControllers。

其中之一包含一个SpriteKit场景,有几个节点,其中5个,没有太重。

在模拟器中一切都很好,但是当在设备上testing时,我注意到在某些情况下,当使用SpriteKit场景切换到ViewController时,会有很大的停顿(大约2秒!)。

其他时间没有停止,立即显示视图。

现在,我知道在这里肯定会出现一些问题,因为iOS应该可以处理这个问题。

这是我的viewDidLoad函数里面的spriteKit场景viewController:

override func viewDidLoad() { super.viewDidLoad() if let scene = MyScene(fileNamed:"MyScene") { // Configure the view. scene.switchView = switchView let parentNode = scene.childNodeWithName("WholeObject") as! SKSpriteNode let contentNode = scene.childNodeWithName("CenterNode") as! SKSpriteNode addPhotoToFrame(contentNode, photoName: "woman", maskName: "circleMask") let node1 = parentNode.childNodeWithName("node1") as! SKSpriteNode addPhotoToFrame(zealNode1, photoName: "motherCircleImage", maskName: "circleMaskSmall") let node2 = parentNode.childNodeWithName("node2") as! SKSpriteNode addPhotoToFrame(zealNode2, photoName: "hairstylistCircleImage", maskName: "circleMaskSmall") let node3 = parentNode.childNodeWithName("node3") as! SKSpriteNode addPhotoToFrame(zealNode3, photoName: "dietCircleImage", maskName: "circleMaskSmall") let skView = self.view as! SKView skView.showsFPS = true skView.showsNodeCount = true /* Sprite Kit applies additional optimizations to improve rendering performance */ skView.ignoresSiblingOrder = true /* Set the scale mode to scale to fit the window */ scene.scaleMode = .AspectFill skView.presentScene(scene) } } 

嗨deloki我快速创build了一个新的项目,并提出了一个解决scheme,它在设备上工作正常…..检查我的代码

这里是我的GameViewController调用GameScene

 import UIKit import SpriteKit extension SKNode { class func unarchiveFromFile1(file : String) -> SKNode? { if let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") { var sceneData = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)! var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData) archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene") let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as! GameScene archiver.finishDecoding() return scene } else { return nil } } } class GameViewController: UIViewController { var skView:SKView! override func viewDidLoad() { super.viewDidLoad() if let scene = GameScene.unarchiveFromFile1("GameScene") as? GameScene { // Configure the view. let graphRect:CGRect = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height) skView = SKView(); skView.frame=graphRect skView.showsFPS = true skView.showsNodeCount = true self.view.addSubview(skView) /* Sprite Kit applies additional optimizations to improve rendering performance */ skView.ignoresSiblingOrder = true /* Set the scale mode to scale to fit the window */ scene.scaleMode = .AspectFill skView.presentScene(scene) let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(3 * Double(NSEC_PER_SEC))) dispatch_after(delayTime, dispatch_get_main_queue()) { let s2=GameViewController1(); self.presentViewController(s2, animated: true, completion: { () -> Void in // }) } } } override func viewDidDisappear(animated: Bool) { if((skView) != nil) { skView .removeFromSuperview(); skView=nil; } } override func shouldAutorotate() -> Bool { return true } override func supportedInterfaceOrientations() -> Int { if UIDevice.currentDevice().userInterfaceIdiom == .Phone { return Int(UIInterfaceOrientationMask.AllButUpsideDown.rawValue) } else { return Int(UIInterfaceOrientationMask.All.rawValue) } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Release any cached data, images, etc that aren't in use. } override func prefersStatusBarHidden() -> Bool { return true } } 

这是我的GameViewController1调用MyScene1

 import UIKit import SpriteKit extension SKNode { class func unarchiveFromFile(file : String) -> SKNode? { if let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") { var sceneData = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)! var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData) archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene") let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as! GameScene archiver.finishDecoding() return scene } else { return nil } } } class GameViewController1: UIViewController { var skView:SKView! override func viewDidLoad() { super.viewDidLoad() if let scene = GameScene.unarchiveFromFile("MyScene1") as? GameScene { // Configure the view. let graphRect:CGRect = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height) skView=SKView() skView.frame=graphRect skView.showsFPS = true skView.showsNodeCount = true /* Sprite Kit applies additional optimizations to improve rendering performance */ skView.ignoresSiblingOrder = true /* Set the scale mode to scale to fit the window */ // scene.scaleMode = .AspectFill self.view.addSubview(skView) skView.presentScene(scene) let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(3 * Double(NSEC_PER_SEC))) dispatch_after(delayTime, dispatch_get_main_queue()) { let s2=GameViewController(); self.presentViewController(s2, animated: true, completion: { () -> Void in // }) } } } override func viewDidDisappear(animated: Bool) { if((skView) != nil) { skView .removeFromSuperview(); skView=nil; } } override func shouldAutorotate() -> Bool { return true } override func supportedInterfaceOrientations() -> Int { if UIDevice.currentDevice().userInterfaceIdiom == .Phone { return Int(UIInterfaceOrientationMask.AllButUpsideDown.rawValue) } else { return Int(UIInterfaceOrientationMask.All.rawValue) } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Release any cached data, images, etc that aren't in use. } override func prefersStatusBarHidden() -> Bool { return true } } 

从故事板创buildSKview我刚从程序创build它,每2秒我从一个视图切换到另一个,它在所有设备上工作正常,但有一点我使用Xcode 6.4和ios9,你可以从http://www.filedropper下载链接.COM / tryit

我不知道是什么触发了这个问题,而是在视图消失之前暂停,为我解决了这个问题。

 override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) self.contentView.paused = false } override func viewWillDisappear(animated: Bool) { super.viewWillDisappear(animated) self.contentView.paused = true }