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