[SceneKit專題]3-Render-Loop渲染迴圈

蘋果API搬運工發表於2017-12-25

說明

本系列文章是對<3D Apple Games by Tutorials>一書的學習記錄和體會

此書對應的程式碼地址

SceneKit系列文章目錄

SCNView有一個delegate屬性,需要遵守SCNSceneRendererDelegate協議,這樣就可以在每幀畫面的動畫和渲染過程中收到代理方法的呼叫.

QQ20170403-202757@2x.png

  1. Update:會呼叫renderer(_:updateAtTime:)代理方法,可以在這裡寫一些基礎邏輯,比如新增或移除node節點.

  2. Execute Actions&Animations:執行actions(動作)和animations(動畫).

  3. Did Apply Animations:會呼叫renderer(_: didApplyAnimationsAtTime:)方法,此時場景中所有節點在這一幀的actions(動作)和animations(動畫)都已經更新完成.

  4. Simulates Physics:物理效果模擬.

  5. Did Simulate Physics:會呼叫renderer(_:didSimulatePhysicsAtTime:)方法,此時物理效果模擬已經完成,可以在這裡新增和物理效果有關的程式碼,比如node在受到一個力影響後改變顏色.

  6. Evaluates Constraints:約束更新.

  7. Will Render Scene:會呼叫renderer(_:willRenderScene:atTime:)方法,此時即將要渲染場景,可以在這裡對場景做最後的更改.

  8. Renders Scene In View:SceneKit在view中渲染場景.

  9. Did Render Scene:會呼叫renderer(_: didRenderScene: atTime:)方法,它標識著一個渲染迴圈的結束,可以寫一些邏輯更新程式碼在這裡,比如遊戲中血量增減.

注意 預設情況下,如果一個場景中沒有任何改變時,Scene Kit會進入"paused"(暫停)狀態,渲染迴圈暫停後代理方法將不會繼續呼叫,為了防止這種情況,需要在建立SCNView例項時設定playing屬性為true如

scnView.playing = true
複製程式碼

這樣渲染迴圈的代理就會一直呼叫.

相關文章