添加14个具有强引用的ARAnchor子类对象时,ARSCNView会冻结

时间:2017-08-02 20:06:52

标签: 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 */
    }

...在渲染锚之后,我在那里添加了我的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(:)被调用,即使之前场景视图已冻结。

2 个答案:

答案 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