天天看點

工作學習筆記——《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.資料驅動

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

繼續閱讀