2016-04-12 13 views
1

SCNView'ım hazır olduğunda bir gecikme var gibi görünüyor ve aslında benim görünümümde görüntülendiğinde, görünümün görünmesi için her zaman beyazın iki saniyelik kısmını görüyorum. Bunu önlemek için ne yapabilirim?Önyükleme Scenekit Sahne

func loadModels(frame:CGRect, type:ItemViewType, completion: (() -> Void)!) { 
    self.container = self.scene.rootNode.childNodeWithName("Container", recursively: true)! 
    self.item = self.container.childNodeWithName("Item", recursively: true) 
    self.pattern = self.item.childNodeWithName("TopLayer", recursively: true) 
    self.buttom = self.item.childNodeWithName("BottomRubber", recursively: true)! 
    self.shell = self.item.childNodeWithName("Shell", recursively: true)! 

    self.leftRimLit = self.scene.rootNode.childNodeWithName("leftRimLit", recursively: true) 
    self.specDirLit = self.scene.rootNode.childNodeWithName("specDirLit", recursively: true) 
    self.omni = self.scene.rootNode.childNodeWithName("omni", recursively: true) 

    self.scnView = SCNView(frame: frame) 

    self.scnView!.scene = self.scene 

    self.scnView!.autoenablesDefaultLighting = false 

    //default position 
    self.scnView?.pointOfView?.position = SCNVector3Make(-1.41011, -21.553, 3.34132) 
    self.scnView?.pointOfView?.eulerAngles = SCNVector3Make(1.58788, -0.0114007, -0.0574705) 
    self.scnView?.pointOfView?.scale = SCNVector3Make(1, 1, 1.5) 

    self.item.pivot = SCNMatrix4MakeTranslation(0, 0, 4) 
    self.item.position = SCNVector3(x: 0.387027979, y: 9.58867455, z: 3.71733069) 
    self.item.scale = SCNVector3(x: 1.0999999, y: 1.0999999, z: 1.10000002) 
    self.item.rotation = SCNVector4(x: 0.865282714, y: 0.455411941, z: 0.20948948, w: 2.20000005) 

    self.container.pivot = SCNMatrix4MakeTranslation(0, 0, 0) 

    self.setBackground(type) 
    self.setItemPosition(type) 

    completion() 
} 

Son konum belirlendikten sonra, konumlandırmanın arka planı doğrudur.

self.SO3DItemView = SO3DItemModel(frame: self.view.frame) 
    self.SO3DItemView!.loadModels(self.view.frame, type: .Tada, completion: 
     {() -> Void in 
      self.view.insertSubview(self.SO3DItemView!.scnView!, belowSubview:self.overlay) 

    UIView.animateWithDuration(0.7, delay: 0.0, options: .CurveEaseIn, animations: 
        {() -> Void in 
        self.overlay.alpha = 0.0 
        }, completion:{ (finished: Bool) -> Void in 
         self.view.sendSubviewToBack(self.overlay) 
       }) 

Şu anda bu bazılarını hafifletmek dönüşen bir bindirme var, ama scnView tamamlamak için oturana önce yavaş cihazlar (iPhone 5) üzerinde hala beyaz görebilirsiniz.

cevap

3

SCNSceneRenderer protokolü (senin SCNView) bir SCNScene kabul edecek bir işlevi prepareObjects:withCompletionHandler: sahiptir. Bu, SceneKit'e herhangi bir başlatma işlemini gerçekleştirmesi için talimat verecektir, aksi takdirde, verilerin GPU'ya aktarılmasından önce sahnenin eklenmesini bekleyecektir.

FWIW Aynı sorunu çözmek için arka plan iplerini kullanarak yerleştim. Eğer ben sahip olan bu kodu çalıştırmak için olsaydı Basit bir örnek aşağıda ...

let scene = SCNScene() 

let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT 
dispatch_async(dispatch_get_global_queue(priority, 0)) { 

    //lengthy scene setup process 
    let slowNode = SCNNode(geometry:SCNSphere(radius:1.0)) 
    sleep(2) 

    dispatch_async(dispatch_get_main_queue()) 
    { 
     scene.rootNode.addChildNode(slowNode) 
    } 
} 

let quickNode = SCNNode(geometry:SCNBox(width:1.0, height:1.0, length:1.0)) 
scene.rootNode.addChildNode(quickNode) 

scnView.scene = scene 

, sen kutusu derhal zaman uygulama başlattı görünecektir. İki saniye sonra küre sahneyi ekleyecektir.

+0

Teşekkürler, bu beni doğru yola koydu. – Codermonk