ios – 如何在不阻塞主线程的情况下添加SCNNode?

ios – 如何在不阻塞主线程的情况下添加SCNNode?,第1张

概述我正在创建并向SceneKit场景添加大量SCNNode,这会导致应用程序冻结一两秒钟. 我想我可以通过使用DispatchQueue.global(qos:.background).async()将所有 *** 作放在后台线程中来解决这个问题,但是没有骰子.它的行为完全相同. 我看到this answer并在添加它们之前将节点放到SCNView.prepare(),希望它会减慢后台线程并防止阻塞.它没有 我正在创建并向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适应的任何速度添加新节点.相反,应用程序完全冻结一两秒,然后所有新节点立即出现.

为什么会发生这种情况,如何在不阻塞主线程的情况下添加大量节点?

解决方法 我不认为使用dispatchQueue可以解决这个问题.如果我替换其他任务而不是创建SCNNode它按预期工作,所以我认为问题与SceneKit有关.

this question的答案表明SceneKit有自己的私有后台线程,它将所有更改批量化.因此,无论我使用什么线程来创建我的SCNNode,它们都会在与渲染循环相同的线程中的同一队列中结束.

我正在使用的丑陋的解决方法是在SceneKit的委托渲染器(_:updateAtTime :)方法中一次添加一些节点,直到它们全部完成.

总结

以上是内存溢出为你收集整理的ios – 如何在不阻塞主线程的情况下添加SCNNode?全部内容,希望文章能够帮你解决ios – 如何在不阻塞主线程的情况下添加SCNNode?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1114766.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存