更改场景时是否必须删除场景?

Does a scene have to be removed when changing scenes?

在 sprite-kit 中,我正在制作一个包含不同场景中的不同级别的游戏。我很好奇如果只是过渡到一个场景会删除另一个场景,还是它们会继续堆积并占用 cpu 的使用量?我正在以这种方式转换它们。

let reveal = SKTransition.fade(with: UIColor.white, duration: 1.5)
let scene = level2(size: self.size)
self.view?.presentScene(scene, transition:reveal)

取决于您所说的删除是什么意思。它将停止 运行,因此从视图绘制和更新周期中删除。现在是否将其从内存中删除取决于您。有一种叫做保留计数的东西,呈现一个场景会增加保留计数,删除会从保留计数中删除。如果保留计数变为零,它将解除分配。

良好做法 #1

通常在执行游戏时只在内存中保留一个场景是一种很好的做法。

良好做法 #2

另一个好的做法是避免强引用循环。具体而言,不应存在对场景本身具有强引用的场景的后代节点。

当前场景

那是在你调用

时说的
 self.view?.presentScene(scene, transition:reveal)

SKView 到场景的强引用已被删除。因此,如果您遵守上述 2 个假设,场景将自动取消初始化并从内存中删除。

测试

你可以自己测试一下。只需将其添加到您的游戏场景中

deinit {
    print("GameScene deinit")
}

实例取消初始化时自动调用此方法。

现在运行

 self.view?.presentScene(scene, transition:reveal) 

并在日志中查找 "GameScene deinit"