Swift 移除ARSCNView后如何让内存恢复正常?建筑套件

In Swift how to get memory back to normal after ARSCNView is removed? ARKIT

我在 ARKit 中创建了游戏,但每次我 运行 游戏时内存使用量都会增加。所以在玩了几次之后游戏崩溃了。我有 3 个控制器。

视图控制器

第一控制器 -> 第二控制器 -> 第三控制器

FirstController 是应用程序启动的地方。 FirstController 在 ARKit 中成功扫描 2D 图像后调用 SecondController。在 SecondController 里面,我有我的 ARKit 游戏。最后一个ThirdController用于显示Score。它也有重播按钮。 (这是 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 以删除您刚刚展示的类型的项目。