2015-10-21 15 views
9

EDYCJA: OK, więc dzieje się tak nawet przy pustej scenie SpriteKit! Co tu może być nie tak? Dlaczego iOS potrzebuje 2 sekund na wyświetlenie sceny SpriteKit?Zatrzymaj się podczas prezentacji ViewController za pomocą SKScene

EDYCJA 2: Po raz pierwszy klikam na pasku zakładek, aby wyświetlić kontroler widoku z SKScene, który wyświetla się natychmiast, ale za każdym razem, gdy spróbuję wrócić do tego kontrolera widoku, wyświetlenie zajmie 2 sekundy!

Mam kontroler pasek kart w mojej aplikacji z wieloma różnymi viewControllers.

Jeden z nich zawiera scenę SpriteKit, z kilkoma węzłami, z których 5 nie jest za ciężkie.

W symulatorze wszystko jest w porządku, ale podczas testowania na urządzeniu zauważyłem, że kiedyś nastąpił duży postój (około 2 sekundy!) Przy przejściu na ViewController ze sceną SpriteKit.

Inne czasy nie występują, a widok jest wyświetlany natychmiast.

Teraz wiem, że musi być coś, co robię źle tutaj, ponieważ iOS powinien z pewnością sobie z tym poradzić.

To jest moja funkcja viewDidLoad wewnątrz viewController ze sceną 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

ty wstępnego ładowania graficzna spróbować przekręceniem swoje grafiki pierwszym użyciem tekstur atlasu lub staramy się wyciągnąć cały rysunek w oddzielnym rysunku wątek OpenGL zależy od wielkości grafiki (szerokość i wysokość) nie od liczby grafik po drugie, dlaczego Dodajesz widok do kontenera root, spróbuj najpierw dodać widok, a potem następny i dalej rysunek – dragoneye

+0

. Zdarza się, że dzieje się tak nawet przy całkowicie pustej scenie! więc nie sądzę, że problem dotyczy grafiki. Jest to również bardzo niespójne ... Czuję, że powinienem ustawić flagę buforowania lub coś, co to naprawić ... – deloki

+0

czy próbowałeś najpierw dodać widok, potem scenę, a potem Gfx – dragoneye

Odpowiedz

1

hi deloki stworzyłem nowy projekt w szybki i pochodzą z roztworu jego działa poprawnie na urządzeniu ..... wymeldowania mój kod

tutaj jest mój GameViewController który nazywamy 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 
    } 
} 

tutaj jest mój GameViewController1 który nazywamy 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 
    } 
} 

tworzenia SKview z ujęć Właśnie stworzył go z programmitically i każde 2 sekundy Jestem przełączania z jednego widoku do drugiego i grzywny pracy na wszystkich urządzeń, ale jedno i używane Xcode 6.4 i ios9 można pobrać odnośnik od http://www.filedropper.com/tryit

1

Nie mam pojęcia, co powoduje problem, ale wstrzymanie przed zniknięciem widoku naprawiło go dla mnie.

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

override func viewWillDisappear(animated: Bool) { 
    super.viewWillDisappear(animated) 
    self.contentView.paused = true 
} 
Powiązane problemy