Sprite Kit会在后台还是在主线程中渲染? 它是如何工作的?

该文档显示了Sprite Kit的简化运行环境。

我正试图了解他们是如何实现它的。 SKView在SKScene上调用-update :。 这首先评估动作,然后模拟物理,并让子类调整场景。 在对场景进行修改之后, SKView最终将节点树渲染到屏幕上。

我不明白的是细节。 Sprite Kit是否通过使用不同的线程或GCD队列从场景渲染分离场景计算? 它是在后台执行所有的OpenGL渲染调用,还是在主线程中发生的一切? Sprite Kit在哪些点上在后台和主线程之间来回切换,以及如何同步处理场景和渲染场景呢? 当你的场景更新花费太长时间会发生什么?

链接文档中的饼图显示了Sprite Kit的渲染循环。 循环的每个部分在主线程上同步执行。 OpenGL渲染由渲染循环结束处的SKView执行。

就像任何渲染循环一样,如果更新部分花费的时间太长,那么帧时间间隔就会被超过。 这将导致帧在下一个vsync上呈现,即帧速率降低。

渲染本身与GLKit一样执行:渲染循环使用CADisplayLink同步到显示器刷新率, frameInterval属性控制每渲染循环显示的刷新次数。 一旦模型更新完成,GL状态将被发送到GPU, [EAGLContext presentRenderbuffer:]被调用来显示SKView渲染缓冲区。 循环现在已经完成,直到显示链接触发时才会重新开始,表明前一帧已经渲染,另一个可以发送到屏幕。

渲染是否发生在主线程没有logging,也不可能知道,但它只是一个实现的细节。 如果它确实发生在另一个线程上,那么整个模型树将不得不在渲染线程中被复制,或者足够的状态以便一个帧可以被渲染,而模型被更新为下一个帧。 最有可能的只是在主线程上同步。 locking将是毫无意义的,如果你要阻止主线程访问状态,直到你完成了渲染,你可能只需要在主线程上进行渲染。