我有这个奇怪的问题。在我的游戏中,我从.sks文件加载场景。当我在主线程上加载它时,我没有任何问题。一切都很好。但是当我加载后台线程时,应用程序因内存问题而崩溃。这是我的代码......
DispatchQueue.global(qos: .background).async {
let nextScene = World(fileNamed: "GameScene")
DispatchQueue.main.async {
self.nextScene = nextScene
self.playerRunningState = .RUNNINGRIGHT
}
}
有没有人知道为什么这可以在主线程上工作,但不能在后台线程上工作。
仅供参考,它在以下一行崩溃:
let nextScene = World(fileNamed: "GameScene")
答案 0 :(得分:0)
在操作Apple的文档中引用的节点时,SpriteKit不是线程安全的:https://developer.apple.com/documentation/spritekit/sknode
对节点的操作必须在主线程中进行。 SKViewDelegate,SKSceneDelegate和SKScene的所有SpriteKit回调都发生在主线程中,这些是对节点进行操作的安全位置。但是,如果您在后台执行其他工作,则应采用类似于清单1的方法。
所有操作必须同步发生在主线程上,并且使新节点成为操作。如果你想对主线程的节点进行操作,那么你必须采用这种方法:
class ViewController: UIViewController {
let queue = DispatchQueue.global()
var makeNodeModifications = false
func backgroundComputation() {
queue.async {
// Perform background calculations but do not modify
// SpriteKit objects
// Set a flag for later modification within the
// SKScene or SKSceneDelegate callback of your choosing
self.makeNodeModifications = true
}
}
}
extension ViewController: SKSceneDelegate {
func update(_ currentTime: TimeInterval, for scene: SKScene) {
if makeNodeModifications {
makeNodeModifications = false
// Make node modifications
}
}
}