遊戲與桌面程式的差異
遊戲不能靠訊息驅動 (掃雷除外),單一畫面需高速更新,必須靠時鐘驅動。大多數遊戲在時鐘驅動下定時渲染幀,且需在幀間隙處理輸入、事件、碰撞、AI 計算,高效靈活的調度器是核心。
調度器組成
- 時鐘驅動器:提供精確虛擬時間。虛擬時間流逝遊戲運行,暫停則遊戲暫停,可調速,所有任務依賴虛擬時間且不知時鐘狀態,簡化時間運算,方便除錯。
- 任務管理器:維護任務列表,知下一任務。三類任務:
- 渲染任務:每幀結束執行,更新畫面。
- 幀任務:每幀執行一次 (如繪製背景)。
- 時間任務:指定時間點/區間觸發,執行一次或多次,完成即刪除。
調度器運作流程
- 從時鐘取得虛擬時間。
- 執行時間任務。
- 執行幀任務。
- 執行渲染任務。
- 取得虛擬時間計算本幀耗時。
- 清理過期任務。
為何不用多執行緒?
- 遊戲任務多、生命週期短,建立/銷毀執行緒開銷大,難控制同步。
- OS 搶先式多任務,無法保證任務在幀內完成或不被中斷。
調度器模擬執行緒管理器:依序執行隊列任務,精確計算耗時。硬體不足時可跳過非必要任務 (如特效);硬體有餘可多執行任務 (如更多 AI),自動動態調節。平滑增刪任務,避免執行緒建銷開銷。
技術選擇
僅需少量 API,決定用 J2SE 開發核心便於除錯,測試無誤再移植 MIDP。
參考:Marshall《Game Programming Gems 3》