我正在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}}属性是只读的。
答案 0 :(得分:3)
听起来像是内存保留问题。确保正确删除了SKScene子类中的任何节点并对其进行了初始化。 将场景委托设置为nil,将VC中引用的任何节点或节点数组设置为nil。
我进行了一个简单的测试,将2个VC嵌入到导航控制器中,第一个具有带有启动按钮的视图,第二个是ARVC。 我运行该会话,将我的自定义场景委托设置为ARVC,当我按下“后退”按钮时,一切都会自行停止,并且会弹出我的ARVC。内存中没有任何内容。
因此,请确保手动删除所有节点以及它们的动画,约束,动作以及与自定义SKScene子类相关的所有内容。 另外,如果可以帮忙,也不要害怕调用sceneView.presentScene(nil)。
答案 1 :(得分:2)
我找不到与此有关的任何官方文档,显然还没有适当的方法来停止会话。我发现与您的情况类似的是work around。
建议您将ARSKView
创建为一次性对象,并在离开控制器之前暂停会话,将视图从超级视图中删除并将其分配为nil。