В Swift, как вернуть память в нормальное состояние после удаления ARSCNView?Аркыт - PullRequest
0 голосов
/ 24 октября 2018

Я создал игру в ARKit, но каждый раз, когда я запускаю игру, использование памяти увеличивается.Так что после нескольких игр игра вылетает.У меня есть 3 контроллера.

ViewControllers

FirstController -> SecondController -> ThirdController

FirstController , где приложение запускается. FirstController вызывает SecondController после успешного сканирования 2D-изображения в ARKit.Внутри 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, но это не помогло

1 Ответ

0 голосов
/ 24 октября 2018

Хорошо, так как вы прокомментировали, что ваши контроллеры представлений находятся внутри контроллера навигации, я предполагаю, что это происходит:

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 для удаления элементов того типа, который вы только что представили, будет работать.

...