我有下一个代码:
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 */
}
...在渲染锚之后,我在那里添加了我的SCNNode。但是,当我使用anchors.append(anchor)
,其中anchors
为[MyAnchorSubclass]
时,场景会在14个添加的锚之后立即冻结。如果我没有在数组中保存锚点,则场景视图不会冻结。
有谁知道它是什么? iOS 11 Beta错误或某种限制?
更新
最后,会发生什么 - renderer(_:didUpdate:for:)
被调用,并且在场景视图冻结后,日志中会显示少量[Technique] World tracking performance is being affected by resource constraints [0]
条消息。
更新1
有趣的事实:在应用程序进入后台并返回后,sessionWasInterrupted(:)
和sessionInterruptionEnded(:)
被调用,即使之前场景视图已冻结。
答案 0 :(得分:2)
好的,您的问题是,您不想维护自己的锚点数组。您想要维护每个锚点的标识符(UUID
)数组。在Apple文档中:
根据锚的 identifier 属性将其视为相等。
原因是,ARKit在后台线程上调用init(anchor :)将锚类的实例从每个ARFrame 复制到下一个。在存储每个ARAnchor
的数组时,您只能及时保留这些锚的一组实例,否则ARKit会丢弃这些实例。
使用您的UUID
个锚数组,如果您需要引用一个,请在会话中迭代当前ARFrame
的锚,以搜索您需要的UUID做某事。
您可以按照以下方式使用某些东西:
func anchorForID(_ anchorID: UUID) -> ARAnchor? {
return session?.currentFrame?.anchors.first(where: { $0.identifier == anchorID })
}
答案 1 :(得分:0)
有谁知道它是什么? iOS 11 Beta错误或某种限制?
请实施回调session(_:didFailWithError:)
,以便在ARSession
失败 - 导致屏幕冻结时看到ARError
返回的内容。
NB。如果您收到Code=200 "World tracking failed."
,我非常想知道,因为我diagnosing that over here。