我有下一个代码:
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."
,因为我在这里诊断。