在后台线程上加载SpriteKit场景会导致应用程序因内存问题而崩溃

时间:2018-06-16 08:07:24

标签: ios swift memory-management sprite-kit

我有这个奇怪的问题。在我的游戏中,我从.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")

1 个答案:

答案 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
        }
    }
}