遊戲主循環不同於事件驅動的 GUI 應用,需在固定時間預算內完成:輸入採樣 → 邏輯更新 (AI、物理、碰撞) → 渲染提交。單線程協作式調度比多線程搶佔式更可控:避免同步開銷、確定性幀順序、便於動態負載均衡。本文設計一套**虛擬時鐘驅動的三級任務調度器**,支持渲染任務、幀任務、定時任務三類任務協作,並內建 CPU 使用率監控與自動降級機制。
System.currentTimeMillis(),單調遞增,硬件同步。start()/stop() (暫停/恢復)、setTimeScale(float) (慢動作/加速)、getVirtualTime()。| 任務類型 | 觸發條件 | 典型用例 | 生命週期 |
|---|---|---|---|
| 渲染任務 | 每幀結束必須執行 | 場景繪製、HUD 更新、緩衝翻屏 | 遊戲運行期間持續存在 |
| 幀任務 | 每幀執行一次 | 輸入處理、物理步進、AI 決策、粒子更新 | 可動態增減 (如特效開關) |
| 定時任務 | 指定虛擬時間點/區間 | 延遲觸發、技能冷卻、過場動畫、定時生成敵人 | 完成即自動銷毀 |
單幀執行流程:
clock.beginFrame() — 記錄幀起始虛擬時間clock.advanceToEnd() — 推進虛擬時間至幀預算末尾clock.stop(),所有定時任務自動凍結,恢復時無需補償邏輯。setTimeScale(0.5f) 實現慢動作回放、子彈時間,遊戲邏輯代碼零修改。public interface Task {
int getType(); // RENDER / FRAME / TIMED
boolean execute(int virtualTime); // 返回 true 表示保留,false 表示移除
int getPriority(); // 幀任務優先級,渲染任務固定最高
int getTriggerTime(); // 定時任務觸發虛擬時間
int getDuration(); // 定時任務持續幀數 (0=一次性)
}
private Clock clock;
private List frameTasks = new ArrayList<>();
private List timedTasks = new ArrayList<>(); // 按 triggerTime 排序
private Task renderTask;
private int frameBudgetMs = 20; // 50 FPS
private int frameCount;
public void executeFrame() {
clock.beginFrame();
int frameStartReal = clock.getSystemTime();
// 1. 定時任務
processTimedTasks(clock.getVirtualTime());
// 2. 幀任務 (按優先級降序)
frameTasks.sort(Comparator.comparingInt(Task::getPriority).reversed());
for (Task t : frameTasks) {
if (!t.execute(clock.getVirtualTime())) {
frameTasks.remove(t); // 一次性任務自移除
}
}
// 3. 渲染任務
if (renderTask != null) renderTask.execute(clock.getVirtualTime());
// 4. 統計與自適應
int frameEndReal = clock.getSystemTime();
int realElapsed = frameEndReal - frameStartReal;
int virtualElapsed = clock.getFrameEnd() - clock.getFrameStart();
int cpuUsage = (realElapsed * 100) / virtualElapsed;
// 動態調整:超預算 110% 觸發降級
if (cpuUsage > 110) {
disableLowPriorityFrameTasks();
} else if (cpuUsage < 70) {
enableHighQualityTasks();
}
clock.advanceToEnd();
cleanupExpiredTasks();
}
System.nanoTime():用 System.currentTimeMillis(),精度 1ms 足夠 20ms 幀預算。Comparator:幀任務優先級用插入排序維護有序列表,或固定優先級陣列。Thread.sleep(1) 循環等待虛擬時間點,MIDP 睡眠精度約 10-20ms,接受微小抖動。虛擬時鐘 + 三級任務調度器架構,將「時間」從「牆鐘時間」解耦為「可控邏輯時間」,賦予遊戲暫停、慢動作、回放、網絡同步、動態質量平衡等高級能力。單線程協作式調度配合確定性幀流程,在資源受限的 J2ME 環境下實現了最大化的 CPU 利用率與最小化的延遲抖動,是移動端遊戲核心架構的經典範式。