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?