在使用SceneKit构建应用程序或游戏时,我们需要用 SCNView 来显示想要的场景,在渲染你的场景时,SCNView 会运行一个循环,该循环处理并绘制场景,
SCNSceneRendererDelegate
中一系列方法展示了整个过程
so, 接下来,我们来详细研究下这个过程。
首先,放张图展示一下整个渲染循环:
SceneKit渲染器中的帧处理过程each Frame 顺时针依次进行如图中的操作:
1.调用renderer(_ : updateAtTime time:)
, SceneKit 在每帧的渲染中会调用此方法一次,目的是将 game logic
游戏的业务逻辑加到循环中,调用过程中SceneKit立即更新场景中的各节点的层次结构,你对场景所做的任何改变都会立即反应并显示出来,可以在这里写一些基础逻辑,比如添加或移除node节点。
-
SceneKit执行附加到场景图的动作
SCNAction
和SCNAnimatable
动画。SCNAction
我会在这篇文章中讲解。 -
调用
renderer(_:didApplyAnimationsAtTime:)
,此时场景中所有节点在这一帧的actions(动作)和animations(动画)都已经更新完成。 -
Simulates Physics:物理效果模拟。这部分会在这篇文章中讲解。
-
调用
renderer(_:didSimulatePhysicsAtTime:)
,此时物理效果模拟已经完成,可以在这里添加和物理效果有关的代码, 比如node在受到一个力影响后改变颜色。 -
Evaluates Constraints:约束更新。
-
调用
renderer(_:willRenderScene:atTime:)
,渲染器已经清除了视窗并准备渲染场景,此时即将要渲染场景,可以在这里对场景做最后的更改。 -
Renders the scene graph in the view,在view中渲染场景。
-
调用
renderer(_: didRenderScene: atTime:)
,完成场景渲染。
小结
通常,我们构建一款游戏应用,会设计出一套游戏玩法gameplay
,玩法中各项任务涉及到的游戏逻辑game logic
就需要我们实现,那 SCNSceneRendererDelegate
就给出了我们去实现这些逻辑的方法。
需要注意的是,默认情况下,如果一个场景中没有任何改变时,Scene Kit会进入paused
状态,渲染循环暂停后代理方法将不会继续调用,为了防止这种情况,需要设置SCNView 的playing
属性为true:
scnView.playing = true
网友评论