我在ARKit中创建了游戏,但是每次运行游戏时,内存使用都会增加。因此,经过几次播放游戏崩溃。我有3个控制器。
ViewControllers
FirstController-> SecondController-> ThirdController
FirstController 是应用程序的启动位置。 FirstController 在ARKit中成功扫描2D图像后,调用 SecondController 。在 SecondController里面我有我的ARKit游戏。最后一个 ThirdController 用于显示分数。它还具有重播按钮。 (这对SecondController来说是一个问题)
class SecondController: UIViewController, ARSCNViewDelegate, SCNPhysicsContactDelegate {
weak var scnScene: SCNScene!
@IBOutlet weak var sceneView: ARSCNView!
override func viewDidLoad() {
super.viewDidLoad()
sceneView.delegate = self
sceneView.scene.physicsWorld.contactDelegate = self
sceneView.autoenablesDefaultLighting = true;
runStartTimer()
startGame()
}
func gameOver() {
let defaults = UserDefaults.standard
defaults.set(score, forKey: "score")
DispatchQueue.main.async {
self.sceneView.scene.rootNode.enumerateChildNodes { (node, stop) in
node.geometry?.materials.first?.diffuse.contents = nil
node.geometry = nil
node.removeFromParentNode()
print("Object Deallocated =)")
}
self.performSegue(withIdentifier: "gameCompleted2", sender: self)
}
}
}
我使用segue从一种观点转移到另一种观点
例如:
self.performSegue(withIdentifier: "gameCompleted2", sender: self)
我也尝试过使用DEINIT,但这并没有帮助
最佳答案
好的,既然您评论说视图控制器位于导航控制器内部,这就是我所假设的情况:
NavigationStack: [FirstViewController, SecondViewController]
*segue to ThirdViewController*
NavigationStack: [FirstViewController, SecondViewController, ThirdViewController]
*segue to SecondViewController*
NavigationStack: [FirstViewController, SecondViewController, ThirdViewController, SecondViewController]
*segue to ThirdViewController*
NavigationStack: [FirstViewController, SecondViewController, ThirdViewController, SecondViewController, ThirdViewController]
依此类推,将视图控制器递归地放置在彼此之上。您可以通过打印
navigationController.viewControllers
进行测试。防止这种情况发生的一种简单方法是以模态方式呈现ThirdViewController并将其关闭,而不是锁定到SecondViewController。
如果要使动画保持与现在相同,则可以编辑
navigationController.viewControllers
来删除刚刚显示的类型的项目。