工作學習筆記——《Game Engine Architecture》

  這本書有助於瞭解商業級3d引擎在底層(渲染、動畫、物理、內存管理),上層(世界、對象模型、腳本集成),工具層(編輯器、數據驅動、debug支持)的一些常用設計模式、基本原理。作者的觀點比較客觀,大多是列舉一些模式,同時指出它們的優缺點與適用範圍。書中的實例也都是Unreal、Quake、Ogre這些業界知名引擎。對我來說一些很少接觸的知識點(3d渲染、動畫、物理),看了作者精彩的描述、分析,有一種想大呼過癮的感覺。同時在工具層、上層的一些方面,即使現在我做的是不入流的手機遊戲,書中的內容也可以和平時的工作互相印證,得到某些啓發。下面記錄一些我認爲的精華內容。


1.內存管理

  常用的有小內存池(大量小體積對象)、堆棧式(類似關卡這種可以整體分配、整體釋放的管理方式),這兩種是碎片無關的,速度快,好實現。


2.資源管理

  設計資源管理系統的一些基本要求(例如版本管理;資源移動、改名的話,資源間的引用關係不能被破壞);資源條件管道線(asset conditioning pipline),要能方便的控制資源如何導出(圖片色深、對應平臺等),對於跨平臺大型3d遊戲可能比較有用。


3.實時模擬(Real-Time Simulation)

  作者似乎不推薦用幀數來更新遊戲世界,而是使用連續時間,例如毫秒數。在動畫上,甚至可以插值出任意時間點的動畫;時間可放縮、甚至倒流。


4.骨骼動畫

  平時工作中使用的都是2d精靈動畫(美術用各種小圖塊拼出一些列動畫幀) ,在書中接觸到骨骼動畫這個概念還是有些震撼。一個靜態3d模型可以由一張紋理圖映射到一組頂點上渲染得到。這樣一組頂點的位置就相當於2d精靈動畫中一幀裏小圖塊的位置。一個比較明顯的3d動畫方式就是給出動畫每一幀裏所有頂點的位置。甚至可以只給出關鍵幀的頂點位置,其餘幀按插值法得到。更進一步,一般動畫中,大量頂點的位置自由度是比較低的,它們可以看成是被某些關節節點所驅動,只要給出這些關節節點的動畫位置,就可以插值平均出其他節點的位置。這些關節節點的動畫信息,即被稱爲骨骼動畫。書中討論比較多的是各種骨骼混合方法,儘量使用程序生成各種效果自然的過度動畫。


5.對象模型

  書中介紹了兩種對象模型:以對象爲中心和以屬性爲中心。以對象爲中心的設計很常見,每個遊戲對象從屬一個類型,每個類型封裝了自己的數據和方法。簡單的使用這種模式,當類繼承體系越來越龐大時,容易導致難以理解、難以維護、分類困難、基類膨脹等各種問題。與一般面向對象設計相同,這個問題的解決之道是分清is-a和as-a,更多使用組合而不是繼承。以屬性爲中心的設計很像高度採用聚合方式的以對象爲中心的設計模式。這裏每個屬性一般是一種具體類型,例如生命值、位置等,它們保有自己的方法,例如移動、生命值改變等。對象視爲屬性的集合。這種方式的優點有不少,像節約內存(每個對象可以只保留自己實際用到的屬性)、更易數據驅動、沒有大繼承體系等。特別的,這種方式經常以屬性列表而不是對象列表的形式存儲數據,對於集中對屬性讀取的操作有更高的緩存命中率,性能上的提升不可小視。這種方式的主要缺點是屬性間的互相影響實現起來比較困難,調試也麻煩。


6.數據驅動

  採用數據驅動的方式,給予設計者和美術工作者一些直接創造遊戲內容的能力,是當今業界面臨越來越龐大的遊戲規模所達成的一個共識。當然,我們也不要在這條路上走的太極端,要考慮好實現一套複雜數據驅動引擎的工作量,和它帶來的生產力提升相比,是否值得實現。



發佈了56 篇原創文章 · 獲贊 26 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章