2015-10-21 11 views
9

MODIFICA: OK, questo succede anche con una scena SpriteKit vuota! Cosa potrebbe esserci di sbagliato qui ?? Perché iOS richiede 2 secondi per visualizzare la scena SpriteKit ??Arresto durante la presentazione di ViewController con SKScene

MODIFICA 2: La prima volta clicco sulla barra delle schede per visualizzare il controller di visualizzazione con SKScene che viene visualizzato immediatamente, ma ogni volta che tento di tornare a questo controller di visualizzazione ci vorranno 2 secondi per visualizzarlo!

Nella mia app ho un controller di barra delle schede con più controller di vista diversi.

Uno di questi contiene una scena SpriteKit, con un paio di nodi, 5 di essi, niente di troppo pesante.

Nel simulatore tutto è a posto, ma durante i test sul dispositivo ho notato che a volte c'è una grande interruzione (circa 2 secondi!) Quando si passa a ViewController con la scena SpriteKit.

Altre volte non c'è interruzione e la vista viene visualizzata immediatamente.

Ora, so che ci deve essere qualcosa che sto facendo male qui, perché iOS dovrebbe sicuramente essere in grado di gestirlo.

Questa è la mia funzione di viewDidLoad all'interno della viewController con la scena 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

stai precarico la grafica cercano di precaricare la grafica del primo utilizzo atlante di texture o cercare di trarre tutti i disegni in un disegno filo OpenGL separato a seconda delle dimensioni della grafica (larghezza e altezza) non sul numero di immagini in secondo Why Una volta aggiunta la vista al contenitore radice, basta provare ad aggiungere prima vista e scena successiva e infine a disegnare finalmente – dragoneye

+0

il fatto è che ciò avvenga anche con scene completamente vuote! quindi non penso che il problema sia con la grafica. E 'anche molto incoerente ... Mi sento come se dovessi impostare qualche flag di caching o qualcosa per sistemare questo ... – deloki

+0

hai provato ad aggiungere la vista prima quindi scena e poi gfx – dragoneye

risposta

1

hi deloki ho creato un nuovo progetto in rapida e sono dotati di una soluzione il suo bel lavoro sul dispositivo ..... check out il mio codice

ecco la mia GameViewController che chiamano 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 
    } 
} 

ecco il mio GameViewController1 che chiamare 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 
    } 
} 

creando SKview da storyboard Ho appena creato da programmitically e ogni due secondi io sono il passaggio da una vista all'altra e il suo funzionamento benissimo su tutti i dispositivi, ma una cosa ho usato Xcode 6.4 e ios9 è possibile scaricare collegamento da http://www.filedropper.com/tryit

1

Non ho idea di cosa faccia scattare il problema, ma fermarsi prima che la vista scomparisse l'ha risolto per me.

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

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