我有下一个代码:
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 回答
好吧,你的问题是,你不想维护你自己的锚点数组 . 您希望维护每个锚点的标识符数组(
UUID
) . 在Apple文档中:原因是,ARKit在后台线程上调用init(anchor :)来将锚类的实例从 each ARFrame 复制到下一个 . 在存储每个
ARAnchor
的数组时,您只能及时保留这些锚点的一组实例,否则这些实例将被ARKit丢弃 .使用你的数组
UUID
的锚点,如果你需要引用一个,在会话中迭代当前ARFrame
的锚点,搜索你需要做的事情的UUID .您可以使用以下内容:
请实现回调
session(_:didFailWithError:)
,以便在_2382139失败时查看ARError会导致屏幕冻结 .NB . 如果你收到
Code=200 "World tracking failed."
我非常想知道,因为我是diagnosing that over here .