我正在一个ARKit会议,我把SceneKit节点。随着每一个节点,我实例化一个新的视图控制器,并通过其观点,该节点的内容如下所示:
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)
}
}
}
到目前为止,一切工作和节点放置在三维空间。但是,当我浏览回到以前的视图控制器的UI冻结,我不能做任何事情。我一直在使用一个展开赛格瑞这样的尝试
@IBAction func goBackToPrevious(_ sender: Any) {
sceneView.session.pause()
self.performSegue(withIdentifier: "unwindToPrevious", sender: self)
}
和导航控制器,我弹出AR现场控制器堆栈。每次上一个视图控制器被冻结。在Xcode中没有错误,应用程序继续运行。如果我等待约2分钟我可以再次使用屏幕。如果我不视图控制器节点添加到我的AR场景,一切工作完全正常。我唯一的解释是,UIThread添加节点时,因为它创建了一个庞大的内存泄漏的地方(我没有,尽管10小时的调试中)是不堪重负。有没有人有类似的经验,能告诉我怎么解决这个问题?我能做些什么来调试这一点,并确保顺利通航?
问题是,我指定我的自定义的UIViewController的意见直接到节点的飞机。我的假设是,这个创建的参考周期,因为视图控制器举行引用我在现场的其他地方使用的对象。我通过捕获视野的图像和指定的一个到所述节点解析它。好像它通常是一种危险的做法是直接分配到UIViews节点,因为它邀请参考周期。也许有人对内存问题和/或SceneKit更有资格可以给这个意见。