gpt4 book ai didi

swift - 添加 14 个具有强引用的 ARAnchor 子类对象时 ARSCNView 卡住

转载 作者:行者123 更新时间:2023-11-28 12:18:56 24 4
gpt4 key购买 nike

我有下一个代码:

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

...渲染 anchor 后,我将在那里添加我的 SCNNode。但是,当我使用 anchors.append(anchor) 时,其中 anchors[MyAnchorSubclass],场景在添加 14 个 anchor 后立即卡住。如果我不在数组中保存 anchor ,场景 View 不会卡住。

有人知道是什么吗? iOS 11 Beta 错误或某种限制?

更新

最后,发生了什么——renderer(_:didUpdate:for:) 被调用,之后场景 View 卡住并且很少有 [技术] 世界跟踪性能受到资源限制的影响[0] 消息出现在日志中。

更新 1

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

最佳答案

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

Anchors are considered equal based on their identifier property.

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

有了 anchor 的 UUID 数组,如果您需要引用一个,则在当前 ARFrame 的 session 中遍历 anchor ,搜索 UUID你需要做某事的那个。

您可以按照以下方式使用:

func anchorForID(_ anchorID: UUID) -> ARAnchor? {

return session?.currentFrame?.anchors.first(where: { $0.identifier == anchorID })

}

关于swift - 添加 14 个具有强引用的 ARAnchor 子类对象时 ARSCNView 卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45470011/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com