2015-10-21 2 views
9

EDIT: Хорошо, так что это происходит даже с пустой сценой SpriteKit! Что может быть неправильным здесь? Почему для iOS требуется 2 секунды для отображения сцены SpriteKit?Остановка при представлении ViewController с SKScene

EDIT 2: В первый раз я нажимаю на панель вкладок, чтобы отображать контроллер вида с SKScene, он отображается сразу, но каждый раз, когда я пытаюсь перейти к этому контроллеру просмотра, на дисплей выводится 2 секунды!

У меня есть контроллер панели вкладок в моем приложении с несколькими разными контрольными окнами.

Один из них содержит сцену SpriteKit, с несколькими узлами, 5 из них, ничего слишком тяжелое.

В симуляторе все в порядке, но при тестировании на устройстве я заметил, что когда-то происходит большая остановка (около 2 секунд!) При переходе на ViewController со сценой SpriteKit.

Другие моменты, когда нет остановки, и сразу отображается.

Теперь я знаю, что должно быть что-то, что я делаю неправильно здесь, потому что iOS определенно сможет справиться с этим.

Это моя viewDidLoad функция внутри ViewController с 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) 
    } 

} 
+0

вы поджимать ваши графики попытаться поджать графику сначала с помощью текстуры атласа или попытаться сделать все рисование в отдельной нити OpenGL рисунка зависит от размера графики (ширина и высота) не на количество графики, во-вторых том, почему u добавление представления в корневой контейнер наконец-то просто попробуйте добавить вид сначала, а затем следующую сцену и дальнейший чертеж – dragoneye

+0

, что происходит, даже с совершенно пустой сценой! поэтому я не думаю, что проблема связана с графикой. Его тоже очень непоследовательно ... Я чувствую, что должен установить некоторый флаг кеширования или что-то, чтобы исправить это ... – deloki

+0

сделал попытку добавить вид сначала, затем сцену, а затем gfx – dragoneye

ответ

1

привет deloki я создал новый проект в быстрой и прийти с решением его прекрасно работать на устройстве ..... заканчивать мой код

вот мой 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 
    } 
} 

создание SKview из раскадровки я просто создал его из programmitically и каждый 2 второго я переключение с одного вида в другое и его рабочем штрафе на всех устройствах, кроме одной вещей я использовал Xcode 6.4 и ios9 вы можете скачать ссылку от http://www.filedropper.com/tryit

1

Я понятия не имею, что вызывает проблему, но приостанавливает работу перед исчезновением взгляда.

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

override func viewWillDisappear(animated: Bool) { 
    super.viewWillDisappear(animated) 
    self.contentView.paused = true 
} 
Смежные вопросы