任務排程器協調遊戲運行過程中每一幀所完成的任務,即使在暫停時也是如此。這些任務包括檢測玩家輸入、動畫角色、更新物理模擬,以及恢復處於 task.wait() 狀態的腳本。
儘管可能有多個任務在運行,但任務排程器有可能會過載,特別是在以下情況下:
- 使用自訂的角色骨架或輸入方案。
- 自行動畫化部件(而非使用 Animator)。
- 嚴重依賴精確的物理效果。
- 定期重複物件。
RunService
逐幀添加任務的最直接方法是通過 RunService 的以下成員:
排程器優先權
任務排程器會根據以下順序對任務進行分類和完成。有些任務可能在一幀內不執行工作,而其他任務則可能多次運行。
* 在 RunService.Heartbeat 期間腳本執行會根據你遊戲的 Workspace.SignalBehavior 設定而有所不同。請參見 延遲事件。
最佳實踐
為了在效率上構建高效能遊戲,請注意以下事項:
除非絕對必要,請不要將函數連接/綁定到渲染步驟。 只有必須在輸入之後但在渲染之前完成的任務應以這種方式執行,例如攝影機移動。若需對執行順序進行嚴格控制,請使用 BindToRenderStep(),而非 PreRender。
仔細管理物理狀態。 PreSimulation 發生在物理運算 之前,而 PostSimulation 發生在物理運算 之後。因此,影響物理狀態的遊戲邏輯應在 PreSimulation 中執行,例如設定部件的 Velocity。相對地,依賴或響應物理狀態的遊戲邏輯應在 PostSimulation 中處理,例如讀取部件的 Position 以檢測它們何時進入定義區域。
Motor6D 變換變更應在 PreSimulation 事件中進行。 如果不這樣做,Animators 將在下一幀覆寫變更。即使沒有 Animator,PreSimulation 也是在應用 Motor6D.Transform 到部件位置之前被觸發的最後一個 Luau 事件。