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

标签 swift scenekit ios11 xcode9-beta arkit

我有下一个代码:

    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/

相关文章:

ios - React Native 应用程序在 iOS 11 上启动屏幕后闪烁白色

iOS - 动态更改字体大小

ios - 将 2 个 ViewController 组合在 TabBarView 的单个选项卡中,并允许在同一选项卡内来回切换

cocoa - 当我尝试将 SCNScene 写入文件时,设置 SCNNode.morpher 会导致崩溃

ios - 如何将 SKScene 添加到 SCNNode 平面?

canvas - ios11 webview html canvas 内容被页面滚动清除

ios - UIViewPropertyAnimator 在呈现另一个 Controller 后停止工作

compiler-errors - 限制表达式中的术语数?

arrays - 如何为每个 CollectionView 部分拥有不同的数据集?

ios - SceneKit 两个节点不发生碰撞