首页 文章

添加14个具有强引用的ARAnchor子类对象时,ARSCNView会冻结

提问于
浏览
0

我有下一个代码:

guard let feauturePoint = frame.hitTest(normalizedPoint, types: .featurePoint).first?.worldTransform else {
        return
    }
    let anchor = MyAnchorSubclass(transform: feauturePoint, plus: someAdditionalInfo)
    arSession.add(anchor: anchor)

这个函数创建并添加了我的ARAnchor子类的对象 . 然后...

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
        guard let anchor = anchor as? MyAnchorSubclass else { return }
        anchors.append(anchor)
        /* then goes some my logic with adding SCNNode */
    }

...在渲染锚之后,我'm adding my SCNNode there. But, when I' m使用 anchors.append(anchor) ,其中 anchors[MyAnchorSubclass] ,场景在14个添加锚之后立即冻结 . 如果我没有在数组中保存锚点,则场景视图不会冻结 .

有谁知道它是什么? iOS 11 Beta漏洞或某种限制?

UPDATE

最后,会发生什么 - 被调用 renderer(_:didUpdate:for:) 并且在场景视图冻结之后,日志中会出现很少的 [Technique] World tracking performance is being affected by resource constraints [0] 消息 .

UPDATE 1

有趣的事实:在应用程序进入后台并返回后, sessionWasInterrupted(:) 和_2382130被调用,即使场景视图之前被冻结了 .

2 回答

  • 0

    好吧,你的问题是,你不想维护你自己的锚点数组 . 您希望维护每个锚点的标识符数组( UUID ) . 在Apple文档中:

    基于标识符属性,锚被认为是相等的 .

    原因是,ARKit在后台线程上调用init(anchor :)来将锚类的实例从 each ARFrame 复制到下一个 . 在存储每个 ARAnchor 的数组时,您只能及时保留这些锚点的一组实例,否则这些实例将被ARKit丢弃 .

    使用你的数组 UUID 的锚点,如果你需要引用一个,在会话中迭代当前 ARFrame 的锚点,搜索你需要做的事情的UUID .

    您可以使用以下内容:

    func anchorForID(_ anchorID: UUID) -> ARAnchor? {
    
        return session?.currentFrame?.anchors.first(where: { $0.identifier == anchorID })
    
    }
    
  • 2

    有谁知道它是什么? iOS 11 Beta漏洞或某种限制?

    请实现回调 session(_:didFailWithError:) ,以便在_2382139失败时查看ARError会导致屏幕冻结 .


    NB . 如果你收到 Code=200 "World tracking failed." 我非常想知道,因为我是diagnosing that over here .

相关问题