使用SKScene呈现ViewController时暂停

del*_*oki 9 ios sprite-kit swift

编辑:好的,所以即使有一个空的SpriteKit场景也会发生这种情况!这可能有什么问题?为什么iOS需要2秒才能显示SpriteKit场景?

编辑2:我第一次点击标签栏以显示带有SKScene的视图控制器,它立即显示,但每次下次我尝试导航回此视图控制器时,它将花费2秒钟显示!

我的应用程序中有一个标签栏控制器,有多个不同的viewControllers.

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

在模拟器中一切都很好,但是当在设备上进行测试时,我注意到在使用SpriteKit场景更改为ViewController时,有时会出现大停顿(大约2秒!).

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

现在,我知道必须有一些我在这里做错了,因为iOS绝对应该能够解决这个问题.

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

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)
    }

}
Run Code Online (Sandbox Code Playgroud)

dra*_*eye 2

你好,deloki,我在 swift 中创建了一个新项目,并提供了一个在设备上运行良好的解决方案......查看我的代码

这是我的 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
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的 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
    }
}
Run Code Online (Sandbox Code Playgroud)

从故事板创建 SKview 我只是以编程方式创建它,每 2 秒我就会从一个视图切换到另一个视图,它在所有设备上都工作正常,但我使用 Xcode 6.4 和 ios9 的一件事是,你可以从http://www.filedropper下载链接.com/tryit