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

时间:2013-12-01 11:30:41

标签: ios iphone ipad opengl-es sprite-kit

documentation显示了Sprite Kit的简化runloop。

我想了解他们是如何实现它的。一个SKView调用-update:在SKScene上。然后首先评估动作,然后模拟物理,并让子类调整场景。在对场景进行更改后,SKView最终将节点树呈现在屏幕上。

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

1 个答案:

答案 0 :(得分:5)

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

与任何渲染循环非常相似,如果更新部分耗时太长,则超出帧时间间隔。这将导致帧在下一个vsync上呈现,即帧速率降低。

渲染本身的执行与GLKit一样:渲染循环使用CADisplayLink同步到显示刷新率,frameInterval属性控制每个渲染循环的显示刷新次数。模型更新完成后,GL状态随后被发送到GPU并调用[EAGLContext presentRenderbuffer:]以显示SKView渲染缓冲区。循环现在已经完成,并且在显示链接触发之前不会再次启动,表示前一帧已渲染,另一帧可以发送到屏幕。

渲染是否发生在主线程之外没有记录,也无法知道,但它只是一个实现细节。如果它确实发生在不同的线程上,则整个模型树必须在渲染线程中重复,或者足够的状态,以便可以渲染一个帧,同时为下一帧更新模型。最有可能的是它只是在主线程上同步。锁定将毫无意义,如果你要在完成渲染之前阻止主线程访问状态,你可以在主线程上进行渲染。