ARKit:暂停会话不会停止调用场景

时间:2017-10-11 07:09:18

标签: ios sprite-kit skscene arkit

我正在ARKit使用SpriteKit。我的AR功能不是我的应用程序的核心功能,用户可以选择导航到ARSKView的viewController,我在SKScene中配置并设置ARsession

我在用户导航回来时暂停会话:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)   
    sceneView.session.pause()
}

然后viewController从推送它的navigationController中弹出。但是我看到我的update(_ currentTime: TimeInterval)子类中的func SKScene一直被调用...这也是阻止它的适当方法吗?我认为暂停ARSession也会停止现场。

编辑:当我从包含ARSKView的视图控制器导航回来并且它已取消初始化时,我看到SKScene仍然在内存中并且是新的每次我再次导航到AR相关的视图控制器时都会创建。所以,如果我在那里导航N次,我看到我在内存中有N SKScene个。在导航回来时,我怎么能适当地移除场景? scene的{​​{1}}属性是只读的。

2 个答案:

答案 0 :(得分:3)

听起来像是内存保留问题。确保正确删除了SKScene子类中的任何节点并对其进行了初始化。 将场景委托设置为nil,将VC中引用的任何节点或节点数组设置为nil。

我进行了一个简单的测试,将2个VC嵌入到导航控制器中,第一个具有带有启动按钮的视图,第二个是ARVC。 我运行该会话,将我的自定义场景委托设置为ARVC,当我按下“后退”按钮时,一切都会自行停止,并且会弹出我的ARVC。内存中没有任何内容。

因此,请确保手动删除所有节点以及它们的动画,约束,动作以及与自定义SKScene子类相关的所有内容。 另外,如果可以帮忙,也不要害怕调用sceneView.presentScene(nil)。

答案 1 :(得分:2)

我找不到与此有关的任何官方文档,显然还没有适当的方法来停止会话。我发现与您的情况类似的是work around

建议您将ARSKView创建为一次性对象,并在离开控制器之前暂停会话,将视图从超级视图中删除并将其分配为nil。