• 沒有找到結果。

遊戲是一種即時軟體,也就是對於時間有嚴格限制的軟體,遊戲中處處與時 間相關,必須在有限的硬體資源下,模擬整個虛擬世界,並與時間取得平衡。

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()

相關文件