遊戲是一種即時軟體,也就是對於時間有嚴格限制的軟體,遊戲中處處與時 間相關,必須在有限的硬體資源下,模擬整個虛擬世界,並與時間取得平衡。
3.1 遊戲迴圈
遊戲的主迴圈是由三個同時執行的任務所組成的。第一,更新,電腦人工智 慧等會改變遊戲世界的事件必須不斷的更新,例如當一名玩家發射了一發子彈,
就必須不斷的更新子彈的位置。第二,輸入,遊戲必須能與玩家互動,處理玩家 的輸入。第三,輸出結果,可能是畫面、聲音、或是搖桿的震動等。玩家的輸入 就像是由外部手動更新程式,電腦人工智慧則像是內部自動更新程式。所以整個 遊戲迴圈其實可以分成兩大部分,「更新區段」和「呈現區段」。
要確保「更新區段」和「呈現區段」能同時執行有幾種作法:
一、 將兩個區段實作在一個主迴圈內:
圖 3-1 單一迴圈流程圖
圖 3-1 是單一迴圈流程圖,此種做法能確保每次執行更新區段後必定執行一 次呈現區段,不過此種作法卻存在著缺點,我們通常以FPS(frame per second),
也就是每秒畫面的更新頻率來決定一個遊戲是否流暢。一般來說,遊戲在資源允 許下必須多執行呈現區段,這樣才能得到最高的FPS,過度的執行更新區段只是
浪費資源而已。但此種做法也使得遊戲和硬體效能的關連性變得太緊密,當今天 換了一部效能較好的電腦,可能不只畫面變流暢而已,連帶使遊戲的速度也加 快,而這並不是預期的結果。
二、 使用雙執行緒:
圖 3-2 雙執行緒流程圖
圖 3-2 是雙執行緒流程圖,此種做法藉由呼叫執行緒來控制區段的執行次 數,能有效的做到資源分配,缺點是需要準確的時間控制及硬體的支援。
三、 單一迴圈加上計時器:
圖 3-3 單一迴圈加計時器流程圖
圖3-3 是單一迴圈加計時器流程圖,這是我們採用的作法,在迴圈執行時候 記錄時間,判斷是否需要呼叫更新器,舉例來說,如果想以每秒十次的頻率更新 遊戲,只要每經過一百毫秒執行一次更新區段即可。
3.2 更新區段
更新區段是使整個虛擬世界運作的核心,包含了「玩家更新區」、「世界更新 區」,世界更新區還包括非玩家角色(NPC)的更新。
玩家更新區
專門處理玩家動作的區塊,分成「玩家輸入」、「玩家限制」與「玩家更新」
等。
(1) 「玩家輸入」必須能讀取玩家的輸入訊號,並轉換成對遊戲有意義的資訊,
例如「同時按下鍵盤 W 鍵及滑鼠左鍵」,轉換成「玩家試圖向左邊移動並使 用武器」。
(2) 「玩家限制」是進一步處理「玩家輸入」產生的資訊,並進行判斷玩家要求 是否可以允許,依前例則需考慮左邊是否有障礙物阻擋,與手中武器是否有 子彈等。
(3) 「玩家更新」即是考慮過限制後,將正確的結果反映到遊戲,依前例左邊如 果沒有障礙物,則啟動移動動畫,並改變玩家位置。
世界更新區
世界物件可分為靜態物件與動態物件,靜態物件像是不會動的牆壁、樹木、
石頭等,在遊戲中扮演了限制玩家的角色,並沒有特別的行為,故不需要特別更 新。而動態物件像是會噴水的噴泉,裊裊的炊煙等,則須不斷隨著時間更新,更 複雜的動態物件像NPC,還須加入人工智慧(AI)系統,需要龐大的時間成本。在 某些大型遊戲世界中,世界更新模組會事先過濾要更新的物品,以提高遊戲的效 率。
整個更新區段如下:
玩家更新區 玩家輸入 玩家限制 玩家更新 世界更新區
靜態物件更新
靜態物件過濾器 更新靜態物件 動態物件更新
動態物件過濾器 更新動態物件 結束
3.3 呈現區段
此區是呈現整個遊戲聲光效果的地方,由於DirectX 在繪製圖形時,須呼叫 BeginScene( )和 EndScene( )函式,所以集中在一個區塊對資源會有比較好的管 控。
BeginScene()
//在此處繪置圖形 EndScene()