该文档显示了Sprite Kit的简化runloop.
我试图了解他们是如何实现它的.一个SKView呼吁-更新:在SKScene.然后首先评估动作,然后模拟物理,并让子类调整场景.在对场景进行更改后,SKView最终将节点树渲染到屏幕.
我不明白的是细节.Sprite Kit是否通过使用不同的线程或GCD队列将场景计算与场景渲染分离?它是在后台执行所有OpenGL渲染调用,还是在主线程上发生了所有事情?Sprite Kit在后台和主线程之间来回切换,以及如何同步处理场景并渲染场景呢?场景更新花费的时间过长会发生什么?
链接文档中的饼图显示了Sprite Kit的渲染循环.循环的每个部分在主线程上同步执行.OpenGL渲染由渲染循环结束时的SKView执行.
与任何渲染循环非常相似,如果更新部分花费的时间太长,则会超出帧时间间隔.这将导致帧在下一个vsync上呈现,即帧速率降低.
渲染本身与GLKit一样执行:渲染循环使用a同步到显示刷新率CADisplayLink
,frameInterval
属性控制每个渲染循环有多少显示刷新.模型更新完成后,GL状态随后被发送到GPU并被[EAGLContext presentRenderbuffer:]
调用以显示SKView渲染缓冲区.循环现在已完成,并且在显示链接触发之前不会再次启动,表示前一帧已呈现,另一帧可以发送到屏幕.
渲染是否发生在主线程之外没有记录,也不可能知道,但它只是一个实现细节.如果它确实发生在不同的线程上,则整个模型树必须在渲染线程中重复,或者足够的状态,以便可以渲染一个帧,同时为下一帧更新模型.最有可能的是它只是在主线程上同步.如果要在完成渲染之前阻止主线程访问状态,那么锁定将毫无意义,您可以在主线程上进行渲染.