SceneKit之渲染循环Render Loop

在使用SceneKit构建应用程序或游戏时,我们需要用 SCNView 来显示想要的场景,在渲染你的场景时,SCNView 会运行一个循环,该循环处理并绘制场景,SCNSceneRendererDelegate 中一系列方法展示了整个过程

so, 接下来,我们来详细研究下这个过程。

首先,放张图展示一下整个渲染循环:

SceneKit之渲染循环Render Loop_第1张图片
SceneKit渲染器中的帧处理过程

each Frame 顺时针依次进行如图中的操作:

1.调用renderer(_ : updateAtTime time:), SceneKit 在每帧的渲染中会调用此方法一次,目的是将 game logic 游戏的业务逻辑加到循环中,调用过程中SceneKit立即更新场景中的各节点的层次结构,你对场景所做的任何改变都会立即反应并显示出来,可以在这里写一些基础逻辑,比如添加或移除node节点。

  1. SceneKit执行附加到场景图的动作SCNActionSCNAnimatable动画。SCNAction 我会在这篇文章中讲解。

  2. 调用 renderer(_:didApplyAnimationsAtTime:) ,此时场景中所有节点在这一帧的actions(动作)和animations(动画)都已经更新完成。

  3. Simulates Physics:物理效果模拟。这部分会在这篇文章中讲解。

  4. 调用renderer(_:didSimulatePhysicsAtTime:),此时物理效果模拟已经完成,可以在这里添加和物理效果有关的代码, 比如node在受到一个力影响后改变颜色。

  5. Evaluates Constraints:约束更新。

  6. 调用renderer(_:willRenderScene:atTime:),渲染器已经清除了视窗并准备渲染场景,此时即将要渲染场景,可以在这里对场景做最后的更改。

  7. Renders the scene graph in the view,在view中渲染场景。

  8. 调用renderer(_: didRenderScene: atTime:),完成场景渲染。

小结

通常,我们构建一款游戏应用,会设计出一套游戏玩法gameplay,玩法中各项任务涉及到的游戏逻辑game logic就需要我们实现,那 SCNSceneRendererDelegate 就给出了我们去实现这些逻辑的方法。
需要注意的是,默认情况下,如果一个场景中没有任何改变时,Scene Kit会进入paused状态,渲染循环暂停后代理方法将不会继续调用,为了防止这种情况,需要设置SCNView 的playing属性为true:

scnView.playing = true

你可能感兴趣的:(SceneKit之渲染循环Render Loop)