SpriteKit,将流程放在另一个核心上?

时间:2017-11-08 23:37:37

标签: ios swift multithreading sprite-kit grand-central-dispatch

想象一下你的

 class NattyScene: SKScene {

你可能有节点的自定义字段,或者每帧发生的其他内容。现在假设你有一些计算,一个很好的例子可能是重心......

var globalCOG: CGPoint
func updateCOG() {
   .. say, get all the .position of all Spaceship ..
   globalCOG = .. some point
}

将这个放在另一个线程上是很有意义的,假设像

这样的问题
  • 线程安全/快速阅读.positions
  • 另一个核心的另一个假定的线程,知道SpriteKit帧(这样你可以用通常的方式计算直到放弃时间等,也许你可能更喜欢跳帧或者其他什么 - 通常的线程游戏编程)< / LI>
  • 你可以将threadsafe / blahblah写回COG全球回到SpriteKit的其余部分

这是什么交易?

  • Swift4 / SpriteKit中的现代成语究竟是什么
  • 你如何强迫它继续使用另一个整体物理核心?

有什么想法吗?

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,这很棒 - 但有没有办法确保它真的在另一个核心?

1 个答案:

答案 0 :(得分:4)

不错的问题,不幸的是,我认为这不可能有两个主要原因。

原因1

您在iOS中没有这种低级别访问权限。

操作系统决定哪个线程在哪个核心上运行。 它还可以根据应用范围之外的多种条件打开和关闭内核。

  

E.g。在Grand Central Dispatch你写的

     

DispatchQueue.global(qos: .background).async { }

     

您无法保证关闭将在不同的核心上执行。

原因2

SpriteKit的游戏运行循环确实执行了一堆东西

  1. 致电更新
  2. 评估行动
  3. 模拟物理
  4. 应用约束
  5. 您的想法确实意味着在call update阶段

    内执行以下步骤
    1. 继续前进&#34;背景&#34;螺纹
    2. 执行一些繁重的计算
    3. 将结果返回主线程
    4. 但此时您无法保证游戏运行循环仍处于call update阶段。它可以在evaluates actions中,也可以在下一帧工作。 另一方面,每帧的渲染时间不超过 16毫秒

      可能的解决方案

      您可以充分利用当前核心允许的64位,而不是针对另一个CPU核心。 请查看有关SceneKit的this Q/A,其中列出了SIMD的优点。