Rob*_*ert 10 multithreading ios scenekit swift swift3
我正在创建并向SceneKit场景添加大量SCNNode,这会导致应用程序冻结一两秒钟.
我以为我可以通过将所有操作放在后台线程中来解决这个问题DispatchQueue.global(qos: .background).async(),但是没有骰子.它的行为完全相同.
我看到了这个答案并SCNView.prepare()在添加节点之前完成了节点,希望它会减慢后台线程并防止阻塞.它没有.
这是一个重现问题的测试函数:
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)
}
})
}
}
Run Code Online (Sandbox Code Playgroud)
当我打电话时,spawnNodesInBackground()我希望场景能够继续正常渲染(可能是以降低的帧速率),而新的节点以CPU适应的速度添加.相反,应用程序完全冻结一两秒,然后所有新节点立即出现.
为什么会发生这种情况,如何在不阻塞主线程的情况下添加大量节点?