美文网首页 SceneKit学习
SceneKit之渲染循环Render Loop

SceneKit之渲染循环Render Loop

作者: 沈枫_ShenF | 来源:发表于2019-05-09 09:59 被阅读5次

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

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

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

    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

        本文链接:https://www.haomeiwen.com/subject/irpioqtx.html