【问题标题】:Swift ARKit How do you fully kill an ARSession?Swift ARKit 你如何完全杀死一个 ARSession?
【发布时间】:2019-03-17 01:58:45
【问题描述】:

我有一个ARSCNView 运行一个ARSession。当然,您可以使用session.pause() 暂停会话,但这仍然有效,使会话继续运行。我尝试通过从其超级视图中删除 ARSCNView 来释放它。 ARSCNView 确实释放了,但 ARSession 之后仍在运行!!您也不能将nil 分配给ARSession。我可以看到ARSessionDelegate

func session(_ session: ARSession, didUpdate frame: ARFrame) 

仍在调用中!

完成后如何使用 ARKit 彻底擦干净?

有可能吗?

【问题讨论】:

  • 你想在 didUpdate 上实现什么?
  • 没什么,这只是一种查看会话仍在运行的方式。
  • 你找到解决办法了吗?
  • Apple 目前没有提供合理结束 ARSession 的方法。但我确实找到了一种可行的解决方法。
  • @GeoffH 我也有同样的问题,您介意分享适合您的解决方法吗?对我来说,我正在尝试在 arsession 和 avcapture 会话之间进行交替。我看到奇怪的行为,并怀疑这与arsession的存在有关

标签: swift arkit arscnview


【解决方案1】:

正式来说,现在你不能。

但是,有一个解决方法:您将 ARSCNView 设为一次性。

离开 AR 时,首先暂停ARSession。然后释放整个ARSCNView 层次结构并将ARSCNView 设置为nil 以获得良好的度量。重建整个 ARSCNView 层次结构并在需要返回 AR 时启动新会话。

var ARview: ARSCNView?

func punchTheClown() {

    ARView?.session.pause()
    ARView?.removeFromSuperview()
    ARView = nil

}

您应用的其他非 AR 区域通常位于与您的 ARSCNView 相同的同级级别的单独视图层次结构中。我期待 Apple 提供一个实际的 stopSession() 函数,这样我们就可以同时不必打小丑了。

【讨论】:

  • 这对我不起作用。即使将场景视图对象设置为 nil,我也可以看到会话处于活动状态。还有其他建议吗?
  • RealityKit 的 ARView() 也存在同样的问题。它对我也不起作用,根本找不到从内存中释放它的方法。
  • 不起作用。甚至 arView.window?.resignKey(), arView.scene.anchors.removeAll(), arView.session.delegate = nil。不知何故,它仍然存在,当创建一个新的 ARView 时,你会看到黄色的“点击恢复”
  • 现在这解决了我的问题
【解决方案2】:

来自文档

暂停时,会话不会跟踪设备运动或捕捉场景 图像,也不与其委托对象协调或更新任何 关联的 ARSCNView 或 ARSKView 对象

如果它没有引起问题,最好不要管它。据我所知。这就像一个视频播放器。您可以随时暂停恢复

来源:.RunOptions ARKit Docs

【讨论】:

  • 很高兴知道。有时,你不能只管它。我需要释放资源。该应用程序不仅仅用于增强现实。 ARSCNView 的 SCNSceneRenderer 正在杀死其他事物的所有更新,除非您销毁 ARSCNView,否则不会停止。我们如何终止会话?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-08
  • 2019-08-24
  • 2015-05-24
  • 2012-08-15
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多