gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:22:42 24 4
gpt4 key购买 nike

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

最佳答案

正如 Apple 文档中引用的那样,SpriteKit 在操作节点时不是线程安全的:https://developer.apple.com/documentation/spritekit/sknode

Manipulations to nodes must occur in the main thread. All of the SpriteKit callbacks for SKViewDelegate, SKSceneDelegate and SKScene occur in the main thread and these are safe places to make manipulations to nodes. However, if you are performing other work in the background, you should adopt an approach similar to Listing 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
}
}
}

关于ios - 在后台线程上加载 SpriteKit 场景会导致应用程序因内存问题而崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50886133/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com