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



我有下一个代码:

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

这个函数创建并添加我的 ARAncor 子类的对象。然后。。。

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 */
}

。渲染锚点后,我在那里添加我的 SCNNode。但是,当我使用anchors.append(anchor)时,anchors[MyAnchorSubclass],场景在添加 14 个锚点后立即冻结。如果我不将定位点保存在数组中,场景视图不会冻结。

有谁知道它是什么? iOS 11 测试版错误或某种限制?

更新

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

更新 1

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

好的,您的问题是,您不想维护自己的锚点数组。您希望维护每个锚点的标识符(UUID(的数组。在苹果文档中:

根据定位点的标识符属性,定位点被视为相等。

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

对于定位点的UUID数组,如果需要引用一个锚点,请在会话中循环访问当前ARFrame的定位点,搜索需要执行某些操作的锚点的 UUID。

您可以使用类似以下内容的内容:

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

有谁知道它是什么? iOS 11 测试版错误或某种限制?

请实现回调session(_:didFailWithError:)以便查看ARSession失败时返回的ARError-导致屏幕冻结。


注意:如果你收到我非常想知道Code=200 "World tracking failed.",因为我在这里诊断。

相关内容

  • 没有找到相关文章

最新更新