我正在创建并向SceneKit场景添加大量SCNNode,这会导致应用程序冻结一两秒钟.
我想我可以通过使用DispatchQueue.global(qos:.background).async()将所有操作放在后台线程中来解决这个问题,但是没有骰子.它的行为完全相同.
我看到this answer并在添加它们之前将节点放到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) } }) } }
当我调用spawnNodesInBackground()时,我期望场景继续正常渲染(可能以降低的帧速率),同时以cpu适应的任何速度添加新节点.相反,应用程序完全冻结一两秒,然后所有新节点立即出现.
为什么会发生这种情况,如何在不阻塞主线程的情况下添加大量节点?