为什么用ARSCNView解雇的ViewController当UI冻结?

问题描述 投票:1回答:1

我正在一个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小时的调试中)是不堪重负。有没有人有类似的经验,能告诉我怎么解决这个问题?我能做些什么来调试这一点,并确保顺利通航?

swift memory-leaks arkit freeze ui-thread
1个回答
1
投票

问题是,我指定我的自定义的UIViewController的意见直接到节点的飞机。我的假设是,这个创建的参考周期,因为视图控制器举行引用我在现场的其他地方使用的对象。我通过捕获视野的图像和指定的一个到所述节点解析它。好像它通常是一种危险的做法是直接分配到UIViews节点,因为它邀请参考周期。也许有人对内存问题和/或SceneKit更有资格可以给这个意见。

© www.soinside.com 2019 - 2024. All rights reserved.