Como adicionar SCNNodes sem bloquear o thread principal?

Estou criando e adicionando um grande número de SCNNodes a uma cena do SceneKit, o que faz com que o aplicativo congele por um segundo ou dois.

Eu pensei que poderia corrigir isso colocando toda a ação em um thread de segundo plano usandoDispatchQueue.global(qos: .background).async(), mas sem dados. Comporta-se exatamente da mesma maneira.

eu viesta resposta e colocar os nós atravésSCNView.prepare() antes de adicioná-los, esperando que isso diminua a velocidade do encadeamento em segundo plano e evite o bloqueio. Isso não aconteceu.

Aqui está uma função de teste que reproduz o problema:

func spawnNodesInBackground() {
    // put all the action in a background thread
    DispatchQueue.global(qos: .background).async {
        var nodes = [SCNNode]()
        for i in 0...5000 {
            // create a simple SCNNode
            let node = SCNNode()
            node.position = SCNVector3(i, i, i)
            let geometry = SCNSphere(radius: 1)
            geometry.firstMaterial?.diffuse.contents = UIColor.white.cgColor
            node.geometry = geometry
            nodes.append(node)
        }
        // run the nodes through prepare()
        self.mySCNView.prepare(nodes, completionHandler: { (Bool) in
            // nodes are prepared, add them to scene
            for node in nodes {
                self.myRootNode.addChildNode(node)
            }
        })
    }
}

Quando eu ligospawnNodesInBackground() Espero que a cena continue renderizando normalmente (talvez a uma taxa de quadros reduzida), enquanto novos nós são adicionados em qualquer ritmo que a CPU esteja confortável. Em vez disso, o aplicativo congela completamente por um segundo ou dois, e todos os novos nós aparecem ao mesmo tempo.

Por que isso está acontecendo e como posso adicionar um grande número de nós sem bloquear o thread principal?

questionAnswers(3)

yourAnswerToTheQuestion