想象一下你的
class NattyScene: SKScene {
你可能有节点的自定义字段,或者每帧发生的其他内容。现在假设你有一些计算,一个很好的例子可能是重心......
var globalCOG: CGPoint
func updateCOG() {
.. say, get all the .position of all Spaceship ..
globalCOG = .. some point
}
将这个放在另一个线程上是很有意义的,假设像
这样的问题这是什么交易?
有什么想法吗?
override func update(_ currentTime: TimeInterval) {
let x = safely get info from a thread on another physical core on the device
print("now that's cool")
}
在另一个核心......
func loopy() {
let x = safely look at info on NattyScene
let globalCOG = calculation
}
请注意,KOD已指出DispatchQueue
,这很棒 - 但有没有办法确保它真的在另一个核心?
答案 0 :(得分:4)
不错的问题,不幸的是,我认为这不可能有两个主要原因。
您在iOS中没有这种低级别访问权限。
操作系统决定哪个线程在哪个核心上运行。 它还可以根据应用范围之外的多种条件打开和关闭内核。
E.g。在Grand Central Dispatch你写的
DispatchQueue.global(qos: .background).async { }
您无法保证关闭将在不同的核心上执行。
SpriteKit的游戏运行循环确实执行了一堆东西
您的想法确实意味着在call update
阶段
但此时您无法保证游戏运行循环仍处于call update
阶段。它可以在evaluates actions
中,也可以在下一帧工作。
另一方面,每帧的渲染时间不超过 16毫秒。
您可以充分利用当前核心允许的64位,而不是针对另一个CPU核心。 请查看有关SceneKit的this Q/A,其中列出了SIMD的优点。