遊戲引擎原理

1.什麼是遊戲引擎?

         考慮你喜歡的幾個不同的遊戲,嘗試設想一下它們的內部是如何設計的。更重要的是,看一下是否能夠找到適用於所有遊戲的任何公共設計元素。例如,所有遊戲都有背景、片頭屏幕、地形圖和背景音樂,是不是?如果是,那麼它們很可能是圍繞遊戲引擎的概念設計的。當你計劃創建多個遊戲,並且不希望每次都做重複的工作時,遊戲引擎就特別有用。

              遊戲引擎對於Windows遊戲的另一個重要好處在於,它允許隱藏針對Windows而與遊戲無關的繁雜代碼。遊戲引擎很好地組織了遊戲代碼,這樣常規的應用程序任務就與遊戲特有的任務分離開來。它爲遊戲開發人員帶來的好處就是可以向遊戲引擎中添加能夠在以後的所有遊戲中重用的特性。此外,使用遊戲引擎還允許簡化遊戲的代碼,將注意力放在最重要的遊戲代碼上。在習慣了使用遊戲引擎之後,你就會想,其他還有什麼方法來開發遊戲?事實上,大多數商業遊戲開發人員都有自己定製的遊戲引擎,這是他們多年來在學習大多數遊戲所需的公共特性的過程中開發出來的。在設計和開發技術要求更高的遊戲時,你自己的遊戲引擎可能會在本書的遊戲引擎基礎之上進行改進和擴充。

 

2.考慮遊戲引擎的作用

         遊戲引擎負責處理各種瑣碎事務:組建遊戲、確保它正確運行以及關閉它。雖然這些任務確實是任何程序都需要的,但是初始化、運行以及在遊戲結束後進行清理等工作的某些方面確實是遊戲所特有的。因此,重要的是,遊戲引擎能夠滿足遊戲的獨特需求,並幫助使圍繞引擎開發遊戲的過程儘可能簡單和直接。有了一個設計優良的遊戲引擎,你就會發現,開發遊戲所需要的代碼比不使用遊戲引擎時少得多。其思想是一次性開發某些核心遊戲程序,將其粘貼在遊戲引擎中,然後只有在絕對必要時纔再次處理它們。例如,在編寫加載圖像並在屏幕上繪製它得代碼之後,就沒有什麼理由要重新編寫這種代碼了。加載和繪製圖像是所有遊戲引擎都需要的一個基本功能。

              TIPS:在時間和資源許可時,可以選擇優化遊戲引擎內部的某些算法,以幫助使其更高效地運行。總地來說,首要目標是實現一個能夠正確運行的遊戲功能,然後有時間的話再考慮優化它。

2.2.1將遊戲分解爲事件

         每一個Windows程序都可以分解爲事件,即在程序運行時發生的事情,例如單擊鼠標和更改窗口大小。正如Windows程序包含必須處理的事件一樣,遊戲也有其在開發過程中必須考慮的一組特有時間。可以將遊戲的初始化過程視爲一個事件,它負責加載遊戲的圖形和聲音、清空遊戲區域、將得分歸零等。類似地,遊戲中也有用戶輸入,意味着單擊鼠標和按鍵操作是遊戲必須自己處理的時間。此外還要牢記一點,在Windows中,可以最小化遊戲或者將其置於後臺,意味着可能希望暫停遊戲。可以使用兩個事件來表示這個激活和停用過程。

              TIPS:許多商業Windows遊戲都只能以全屏模式運行,這意味着它們不能與其他正在運行的Windows應用程序並列顯示在屏幕上。即使如此,在技術上這些遊戲仍然是與其他程序同時運行的,因此必須能夠在另一個應用程序激活時暫停它們。

              許多事件當然都可以包括在遊戲引擎之中,但是下面這些事件是適用於任何遊戲的部分核心事件:

              初始化,

              啓動,

              結束,

              激活,

              停用,

              繪製,

              循環。

              初始化時間在一開始運行遊戲發生,這時遊戲將執行重要的初始設置任務,包括創建遊戲引擎本身。啓動和結束事件對應於遊戲的開始和結束,這時很適合執行與特定的遊戲會話相關聯的初始化和清理任務。在最小化遊戲或者將其發送到後臺,然後恢復時,就將發生激活和停用事件。當遊戲需要繪製本身時,將其發送繪製事件,類似於Windows WM_PAINT消息。最後,循環事件使遊戲執行一個單獨的遊戲週期,它非常重要,隨後讀者就將瞭解到這一點。

         2.2.2建立遊戲的計時機制

         如果從來都沒有從編程的角度看過遊戲,那麼你可能會對遊戲中實現所有移動和動畫的方式感到吃驚。除了及其簡單的紙牌遊戲之外,幾乎每一個遊戲都依賴於某種計時機制,使遊戲將其執行分解爲幀或者週期。遊戲的一個週期是一個時間片,通常對應於遊戲圖形和數據的一個單獨的快照。如果將遊戲視爲在VCR或者DVD播放機上播放的電影,那麼按pause鍵允許查看一個獨立的週期。在電影中前進一幀就好像是進入了遊戲的下一個週期。在任何給定的週期中,有希望城了更新其圖形、執行其他任何與角色和對象如何移動及彼此交互的計算和處理等工作。

              理解遊戲週期的重要性的一個好方法是舉一個實際的遊戲作爲例子。以space invaders遊戲爲例,要創建船以及幾排外來入侵者。各個對象都有一個初始的位置和速度。如果space invaders沒有計時機制或者遊戲週期,那麼這個遊戲將永遠停在其初始狀態,就好像在遊戲開始時按下了一個永久的pause按鈕一樣。不過,我們知道情況並非如此,因爲在遊戲開始時,敵人正緩慢地經過屏幕。如果一個週期一個週期地觀看space invaders,則會注意到敵人在每一個週期中只是移動一點點。這還少因爲在一段給定的時間內會發生許多個週期,產生平滑移動的效果。遊戲週期的作用是更新遊戲中所有對象的狀態,然後再通過更新在屏幕上顯示的圖形來反映這些變化。從大多數遊戲中的事物在視覺上的變化速度來判斷,你能猜出發生遊戲週期的頻率嗎?即使對於最慢的遊戲,這個頻率也不低於12週期每秒,這正好是人眼以爲看到的事物在移動而不是看到一系列變化圖像的最低頻率。作一個比較,電視每秒顯示30副不同的圖像,而電影每秒是顯示24副圖像。

              TIPS:遊戲中一個單獨的圖形屏幕稱爲一幀。因爲在每一個遊戲週期中都要繪製一屏幕新的圖形,所以遊戲的速度經常是用每秒的幀數來衡量的。因爲我們討論的中心是週期而不是幀,所以我以每秒的週期數來表示遊戲速度。不過,每秒的週期數、每秒的幀數以及每秒的圖像數實際上都是一個意思。

              遊戲在指定時間內運行的週期越多,看起來運行得 就越平滑。舉一個極端的例子,比較一下演示文稿和電影的平滑度。演示文稿是從一副靜止的圖像突然轉換爲另一幅靜止的圖像,不存在任何過度,也沒有平滑移動的感覺:而電影則呈現出流暢的動作,就彷彿在現實中經歷一般。類似地,每秒鐘只有較少週期的遊戲看上去是斷斷續續的,而每秒鐘較多的週期數會使遊戲更加平滑。每秒鐘較多的週期數還允許靈活地加快或者放慢遊戲,從而達到一個理想的速度。

              在知道了更多的週期產生更平滑的圖形並提供更好的靈活性之後,讀者可能會認爲能夠每秒鐘的週期數設置得很高就行。與現實中的大多數情況一樣,對於遊戲週期和遊戲效率來說,也存在一個權衡考慮。問題在於,在遊戲的各個中期中發生的處理量經常是相當大的,這意味着要想每秒鐘執行多個週期,計算機的處理器和顯卡都必須能夠跟上這種速度。即使對於目前流行的速度極快的計算機來說,大多數計算機執行遊戲處理的速度也是有實際限制的。事實上,大多數遊戲設置都在15~20週期每秒的範圍內,最快的速度可能達到30週期每秒,比電影的速度還快。除了極少數的一些情況外,應該力求達到的最低速度設置爲12週期每秒。

              TIPS:商業3D遊戲是將當前可用的計算機硬件的性能發揮到極致。現代3D遊戲的每秒週期數是用來衡量這個遊戲是否過於加重計算機的處理能力負擔的最常見標準。在理想情況下,可以將遊戲設計爲包括非常精緻而漂亮的圖形,而不用當心遊戲是否會使用戶系統突然停止運行。在顯示情況下,遊戲設計者總是很謹慎地使用遊戲看上去驚人的效果,同時保持適當的幀頻(理想值爲30幀/秒或者更大)。

              在理解了如何用週期來說明遊戲的計時機制之後,讀者可能就會明白爲什麼循環是一種遊戲事件。它得工作原理是這樣的:一開始運行遊戲時,使用遊戲速度(每秒的週期數)初始化引擎。加入使用12週期每秒,那麼遊戲引擎負責設置和管理一個計時器,它每秒出發12個循環事件。遊戲代碼接收這些循環消息並處理它們---更新遊戲中的對象並重新繪製遊戲屏幕。可以將一個循環事件視爲一個周而復始工作的叫醒入睡者的報警器,只不過在這種情況下是每秒響12次。很顯然,遊戲不會有太多的睡眠時間!

              TIPS:說到睡眠,遊戲引擎的另一個作用是每當遊戲不再是活動窗口就使其休眠。實際上,使遊戲休眠僅僅意味着遊戲引擎停止發送循環消息,因爲沒有發送任何循環性消息,所以遊戲實際上就暫停了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章