【发布时间】: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)
}
}
我对@987654332@没有任何财产。
【问题讨论】:
-
您的代码有更大的问题,您需要在删除后保留指向您的 SKScene 或 ARView 的指针,并确保在创建 SKScene 的位置重用此指针实例
-
如果您的视图正在从内存中删除,您的场景也应该从内存中删除。如果它停留,那么你有一个所谓的保留循环,你的场景被一个块保留,一个块正在保留一个场景,所以什么都没有得到 deinit
-
@Knight0fDragon 我没有在视图控制器中向
SKScene声明任何属性,但向ARSKView声明了一个属性。然后在视图控制器中创建场景并将其关联到sceneView,正如我现在在我的问题中展示的那样。 -
是的,如果需要保存SKScene,那是个问题,如果不需要保存,则需要找出保留场景的内容。我在最近的 2 个 cmets 中讨论了这两种情况。
-
@Knight0fDragon 也保留了
ARSKView,并且每次视图控制器都创建一个新的。
标签: ios memory-management sprite-kit skscene arkit