游戲引擎在國內還是有一批人走在前沿的,但出於種種的原因發展的並不是很好,並且引擎的神秘面紗和不可揣測的高難度使一些人還沒有正式開始就已經打了退堂鼓。通常我們說游戲引擎的時候總是想到3D游戲引擎,的確游戲引擎發展到今天將它發揮到極致的正是3D引擎,但在3D引擎之前其實還是有很多2D,2.5D游戲引擎的,它們現在雖然看起來很弱,但卻為3D引擎的產生提供了巨大的理論支持。
原理上講引擎的結構真的很簡單,並沒有大多數人想的那麼復雜。本篇文章不會講更復雜的引擎,僅僅針對j2me來講,但麻雀雖小五髒俱全,我們不能因為J2ME游戲可能連一幅圖片的大小都不如而放松對引擎的要求,一方面是理論的需要,另一方面引擎一但開發成功可以大大減少程序與美工的工作量和提高產品質量和數量。如果單單講非常抽象的講引擎的話大家可能非常難以接受,那麼我就從一個和游戲非常相近的產業開始說起。這個產業就是電影。電影從某種程度上給與了游戲引擎以豐富的抽象框架與理論,也可以說功不可沒。那麼Ok,我們就從一個電影的拍攝過程來了解引擎的各個部分吧。我們為了邏輯上的嚴謹首先要聲明幾個前提條件:
1.劇本已經有了(游戲策劃案) 2.拍電影需要的資源(道具,群眾演員(NPC),主角。這些其實就相當於游戲開發過程中的資源,美工已經把東西都做OK了)
下面是一個電影拍攝的場景:
人物:導演,劇務,攝影師,主角,其它演員(張三,李四等等),其它劇組人員
道具:一把槍,一個木箱,幾個麻袋,一個藥箱,一個彈夾
場景:狹窄的街道,兩旁是破舊的房子,碎石地面
攝影機:兩個
(0)這是一個抗日英雄在街道與敵人殊死搏斗的,姑且叫片斷吧
(1)馬上要開拍了,可是東西還沒有准備好,導演見此狀大喝:劇務,根據我給你的單子把道具搬出來!聽到導演要求道具,劇務開始行動。嗨咻~嗨咻~ 終於從庫房裡搬出了所有道具並根據要求擺放到了相應的位置。“動作這麼慢,你是MOTO吧,人家Nokia比搬的快多了。”:導演喝道。
(2)道具擺好了,導演對當前的攝影又不滿意了,嘿你們怎麼回事,快把鏡頭移到xx去,於是攝影師又將鏡頭擺放到了合適的位置
(3)“嗨,說你那,張三,到那兒去,站好了別動。李四,站在xx,都別動啊,等鏡頭移過去了再按我教給你的動”:導演喝口水說到。
(4)“嘿嘿,主角大人,您看您准備好了嗎?要不,您站到xx去?給您一把槍,唉呦呦,別對著我啊”導演討好道。
(5) 各就各位,開始。。。
暫時先把電影的問題講到這兒,我們一起來看看,當中都包含了那些和引擎中相同的元素,從上面的編號開始說。
(0)敘述了一個故事的片斷,請大家想想和游戲中哪部分很想象?沒錯,腳本!它在大體上敘述了當前描述了一個什麼故事,以及故事中各個角色將要發生的行為和事件,比如:主角被張三打了一槍托,李四被主角打死等等,而張三和李四被打死後主角沖出包圍,那麼放到游戲中通俗的說就相當於主角過關的條件,張三李四的死觸發了劇情繼續往下發展的事件。舉一反三,我們的游戲如果關卡的BOSS被干掉了,才能繼續往下玩,夠直白了吧。OK,這是腳本系統。
(1)劇務根據導演的要求從庫房拿出了道具並且擺放到了場景中。這在引擎中又代表了什麼呢?1.導演,2道具,3場景,它們很好的將引擎幾個大的部分抽象了出來。
導演=場景控制器
劇務=場景管理器
場景=場景系統
“導演”通過向“劇務”發出請求,“劇務”根據請求將資源載入,並將資源放到自己的管理列表中,而具體放到什麼位置,則是“導演”來控制,等資源使用完畢,“劇務”將資源從列表中釋放。這是很重要的一個過程,也許100個程序員有100種控制方法,但目的只有一個,在有限的空間和CPU資源中最大程度照顧I/O效率與執行效率。(後面章節會有一些典型代碼與控制方法供大家參考)
說到“場景”這個就比較讓我頭疼了,原因是抽象它到引擎中比較難,就不說大家看不懂的話了,它就是我們做游戲時的地圖系統。游戲到那個“場景”受“導演”控制,而資源依然受“劇務”管理。這樣說大家明白了吧。
關於場景控制器下面會有專門的一章來說。
(2)導演要求鏡頭怎麼怎麼樣,這代表了什麼呢?根據我們以往的經驗,似乎找不到更合適的。但細細想又能找到些什麼線索。鏡頭將當前的場景截取了一部分,然後呢,將影像錄制到了底片上,哦,是不是這樣呢?鏡頭相當於我們當前要“渲染”的場景區域,“攝像機”將區域中所有元素“渲染”到底片上,而“底片”相當於我們的屏幕呢?OK,越來越接近了,沒錯,引擎中最最重要的部分出來了“鏡頭”和“渲染器”。在3D引擎中這兩個部分幾乎占去了6成的開發時間,在引擎的評估中恐怕效果好不好是我們最直觀的一個因素了吧。大家都是玩游戲的,這點能理解。當然,“攝像機”仍然在受“導演”的控制,從這裡不難看出,一個好游戲“導演”是多麼的重要,即不能喧賓奪主哄搶系統資源,又要起舉足輕重的作用。這也是我們設計引擎難點之一,之二嘛就是“攝像機”和“渲染器”了,至少筆者是這麼想的。
(3)(4)仍然是在描述“導演”的作用,只不過多了“群眾演員”,它最好理解,其實就相當於游戲中的NPC,他們有自己的行動模式和相關屬性。看著簡單,卻不知有多少程序員在有限的資源下增加他們的AI付出了巨大的心血。向程序員致敬,程序員是偉大的職業...別~別~~~!扔臭雞蛋,我接著說還不好嘛。
(5)“各就各位,開始。。。”為什麼要把它單拿出來呢?實際上我是想大家回顧和消化一下上面拍電影都作了哪些工作,以及真正的引擎在游戲開始前都要做哪些工作,方便更好的理解引擎各部分的作用,從抽象到現實開發有一個比較。好啦,我目前對引擎結構的理解就是這樣了,知道多少說多少,還可能有不對的地方,希望大蝦們批評指正,免得害了小蟹們。下面我們做一個小結
故事片斷 = 腳本系統
導演 = 場景控制器
劇務 = 場景管理器
鏡頭 = camera
攝像機 = Render(渲染器)
場景 = 地圖系統
群眾演員 = NPC
還有一個不得不說的部分,就是機器本身的事件處理模塊,放到手機中理解就是鍵盤事件,來電事件,異常事件等等,因為和拍電影沒什麼太大的關系,所以單拿到最後來說。別忘了咱們的“主角”可是受外部事件才驅動起來的。並且“主角”的行為很大程度上影響了“導演”的指揮,比如“主角”受到鍵盤事件向前走,那麼“導演”就要求“鏡頭”也要跟進,“場景”也跟著變化,而在什麼時候出現“群眾演員”也是跟著變化的。