Unigine update()和flush()和render()的區別

world腳本具有許多用於編寫應用程序邏輯的函數。世界腳本(init())的初始化函數用於創建對象並初始化世界負載上的所有其他必要資源。卸載世界時調用關閉函數(shutdown()),用於刪除在腳本執行期間創建的資源以避免內存泄漏。

但是逐幀更新怎麼樣?在世界腳本中有三個塊:

  • update()中你可以放置任何邏輯:控制在屏幕上呈現的內容以及如何操作,渲染到紋理,創建節點,調用控制檯命令等等
  • flush()中,您可以模擬物理:執行連續操作(根據當前電機的RPM推動汽車前進,模擬持續吹風,立即執行碰撞響應等)。
  • render()中,您可以根據同一幀中更新的節點狀態來糾正行爲

Update()

在世界腳本update()中,您可以在應用程序執行時將每個框架都調用所有函數。它用於實現任何邏輯。簡而言之,您可以在update()中控制很多事情(無論是否與圖形相關。在這裏你可以:

注意

不要在更新()中對剛體施加扭矩。否則,您將獲得隨每個渲染幀而變化的不穩定結果。所有連續操作必須在flush()內

World Callbacks

update()中設置的回調(例如,通過使用WorldTrigger小部件回調)不會立即執行。它們將僅在調用下一個引擎函數時運行:即,在flush()之前,如果有(在當前幀中),或在下一次更新之前()(在下一幀中) - 無論先發生什麼。

flush()

world腳本的flush()函數用於控制應用程序中的物理。此功能應用於連續操作,例如根據當前電機的RPM推動汽車前進,模擬持續吹風,執行即時碰撞響應(因爲在單個渲染幀期間可以多次執行flush(),您可以處理多次反彈對象,當它們相互碰撞並監視它們時,update()只顯示最終結果)等等。因此,在flush()中你可以:

 

注意對於flush()中可以做什麼,有一些限制。由於主循環在刷新調用期間訪問節點列表及其轉換數據,因此您無法執行以下操作

  • 如果啓用了節點,請重新定位和轉換節點。
  • 創建新節點。
  • 刪除節點。

這些操作可能違反正在進行的渲染過程。

Physics Callbacks

就像update()一樣,如果在flush()中設置任何基於物理的回調或使用PhysicalTrigger,它們就不能立即執行,因爲渲染過程已經在運行並且它們可以違反它。如果還有一個物理迭代要去,它們會在下一個flush()之前執行; 如果沒有,則在下一個世界腳本update()之前

如果要重新定位或轉換,創建或刪除物理回調返回的節點,工作流程如下:將它們存儲在數組中,然後在update()中執行所有必要的操作。

代碼渲染()

世界腳本的render()函數是用於在節點狀態更新後糾正行爲的附加函數(例如,已在當前幀中播放蒙皮動畫或粒子系統已生成其粒子)。

想象一下,當我們需要將一個對象(比方說,一把劍)附加到蒙皮網格角色的手上時。如果我們在update()函數中轉換角色手骨並將其設置爲劍,則附件將是鬆散的而不是精確的。劍不會緊緊握在手中,因爲動畫實際上是在執行了世界腳本update()之後播放的。這意味着,update()中返回的骨骼轉換將用於前一幀。播放動畫後執行世界腳本render(),這意味着您可以在此函數中獲取當前幀的更新骨骼變換並將其設置爲劍。

注意

使用render()僅用於更正目的; 否則,這將增加主循環時間。所有其他函數應放在update()flush()(physics)中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章