我在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来删除刚刚显示的类型的项目。

07-26 04:03