gpt4 book ai didi

swift - 为什么在使用 ARSCNView 关闭 ViewController 时 UI 会卡住?

转载 作者:行者123 更新时间:2023-11-28 05:46:32 25 4
gpt4 key购买 nike

我正在运行一个放置 SceneKit 节点的 ARKit session 。对于每个节点,我都实例化了一个新的 View Controller ,并将其 View 作为节点的内容传递,如下所示:

func createTextNode(anchor: ARCardAnchor) -> SCNNode? {
let plane = SCNPlane()
plane.height = 0.5
plane.width = 0.5

let sb = UIStoryboard(name: "Main", bundle: nil)
let fCVC = sb.instantiateViewController(withIdentifier: "CardViewController") as! CardViewController


plane.firstMaterial?.diffuse.contents = fCVC.view
let cardNode = SCNNode(geometry: plane)
cardNode.constraints = [billboardConstraint]
return cardNode
}

我使用以下 ARSCNViewDelegate 方法和我的自定义 ARCardAnchor(ARAnchor 的子类)将节点添加到场景中:

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {

if let fcanchor = anchor as? ARCardAnchor {
DispatchQueue.main.async {
guard let n = self.nodeCreator.createTextNode(anchor: fcanchor) else { return }
node.addChildNode(n)

}
}
}

到目前为止一切正常,节点放置在 3D 空间中。但是,当我导航回之前的 View Controller 时,UI 卡住了,我什么也做不了。我试过使用这样的放松转场

@IBAction func goBackToPrevious(_ sender: Any) {
sceneView.session.pause()
self.performSegue(withIdentifier: "unwindToPrevious", sender: self)
}

还有一个导航 Controller ,我在其中将 AR 场景 Controller 从堆栈中弹出。每次以前的 View Controller 被卡住。 Xcode 中没有错误,应用程序继续运行。如果我等待大约。 2 分钟我可以再次使用屏幕。如果我不将带有 View Controller 的节点添加到我的 AR 场景中,一切都可以正常工作。我唯一的解释是 UIThread 在添加节点时不堪重负,因为它会在某处造成大量内存泄漏(尽管调试了 10 个小时我还没有发现)。有没有人有类似的经历,可以告诉我如何解决这个问题?我该怎么做才能对此进行调试并确保顺利导航?

最佳答案

问题是我将我的自定义 UIViewController View 直接分配给了节点的平面。我的假设是,这创建了引用循环,因为 View Controller 保存了对我在场景中其他地方使用的对象的引用。我通过捕获 View 图像并将其分配给节点来解决它。似乎将 UIView 直接分配给节点通常是一种危险的做法,因为它会引发引用循环。也许在内存问题和/或 SceneKit 方面更有资格的人可以对此发表意见。

关于swift - 为什么在使用 ARSCNView 关闭 ViewController 时 UI 会卡住?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54506537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com