【问题标题】:ARKit and SpriteKit: how to remove the SKScene?ARKit 和 SpriteKit:如何移除 SKScene?
【发布时间】:2017-10-30 12:03:29
【问题描述】:

我的 AR 功能不是我的应用程序的核心功能,用户可以选择导航到带有 ARSKView 的 viewController,我在 ARsession 中配置和设置 SKScene

当用户从该 viewController 导航回来并且它从推送它的 navigationController 弹出时,我注意到我的 SKScene 子类中的 func update(_ currentTime: TimeInterval) 一直被调用......所以我将它添加到视图控制器:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    sceneView.session.pause()
    sceneView.scene?.isPaused = true
}

但是,对我来说这不是一个解决方案,因为当我从包含 ARSKView 的视图控制器导航回来并且它被取消初始化时,我看到 SKScene 保存在内存中,并且每创建一个新的我再次导航到与 AR 相关的视图控制器的时间。所以,如果我在那里导航 N 次,我看到我有 N SKScenes 在内存中。

在导航返回时如何适当处理此问题并删除场景? ARsession 的场景属性是只读的。

编辑:在我的视图控制器中:

fileprivate let sceneView = ARSKView()

private func setup() {
    if ARWorldTrackingConfiguration.isSupported {
        let myScene = MyScene(size: sceneView.bounds.size)
        myScene.sceneDelegate = self
        myScene.scaleMode = .resizeFill

        sceneView.delegate = self
        sceneView.presentScene(myScene)
    }
}

我对@9​​87654332@没有任何财产。

【问题讨论】:

  • 您的代码有更大的问题,您需要在删除后保留指向您的 SKScene 或 ARView 的指针,并确保在创建 SKScene 的位置重用此指针实例
  • 如果您的视图正在从内存中删除,您的场景也应该从内存中删除。如果它停留,那么你有一个所谓的保留循环,你的场景被一个块保留,一个块正在保留一个场景,所以什么都没有得到 deinit
  • @Knight0fDragon 我没有在视图控制器中向SKScene 声明任何属性,但向ARSKView 声明了一个属性。然后在视图控制器中创建场景并将其关联到sceneView,正如我现在在我的问题中展示的那样。
  • 是的,如果需要保存SKScene,那是个问题,如果不需要保存,则需要找出保留场景的内容。我在最近的 2 个 cmets 中讨论了这两种情况。
  • @Knight0fDragon 也保留了ARSKView,并且每次视图控制器都创建一个新的。

标签: ios memory-management sprite-kit skscene arkit


【解决方案1】:

ARSKView 中存在内存泄漏。 Apple 已在 ios 12 中解决此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-27
    • 2023-03-22
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    相关资源
    最近更新 更多