新的一年,又拿到了五天學(xué)習(xí)日
今年大概有三天要用來讀它了,經(jīng)典神書一本
我以前的思考方式都是往深處去想去鑽研
而偶爾看一下這種往廣處看的書籍也不錯(cuò)
接著的筆記會(huì)寫得很零散,因?yàn)槲疫吙催厡懀賮砭褪窃臅幻庖欢褟U話那些我會(huì)跳過
我自己的看法會(huì)標(biāo)上"編按"兩個(gè)字
==================================================================
§Chapter 1 - 介紹
每本書都會(huì)有的介紹環(huán)節(jié)
- 從這本書可以學(xué)到
- 企業(yè)強(qiáng)度的遊戲引擎怎麼架構(gòu)的
- 遊戲開發(fā)團(tuán)隊(duì)怎麼組織起來的
- 遊戲引擎中有哪些常見的子系統(tǒng)以及設(shè)計(jì)模式
- 每個(gè)子系統(tǒng)的需求
- 哪些子系統(tǒng)是跟遊戲種類相關(guān)或無關(guān)的,或者甚至是為了某種遊戲種類設(shè)計(jì)的
- 遊戲引擎的部分會(huì)在何時(shí)收尾,然後開始遊戲設(shè)計(jì)
- 一窺熱門引擎的內(nèi)部運(yùn)作
- Quake, Unreal, Unity, 中介軟體像是Havok, OGRE, Granny 3D也有
- 也會(huì)探索像是頑皮狗的自有引擎 (編按: Hmm但是最近頑皮狗的狀況...)
- 本書假設(shè)讀者有著一些C++, 線性代數(shù), 三角函數(shù)等等遊戲常見基本數(shù)學(xué)的基礎(chǔ)
- 編按: 結(jié)合其他語言其實(shí)也很常見, 例如gameplay腳本用python, 編輯器用C#, 但runtime核心實(shí)在很難因?yàn)樾芏艞塁++
- 一個(gè)遊戲開發(fā)團(tuán)隊(duì)的結(jié)構(gòu)
- 工程師, 大致分成runtime工程師(撰寫引擎及遊戲本身), 以及工具工程師(撰寫離線工具讓團(tuán)隊(duì)工作更有效率), 兩邊又會(huì)再依專業(yè)專注在某一種系統(tǒng)上, 像是繪圖, 物理, AI, 音效或是玩法等等
- 美術(shù), 包含提供大方向的概念美術(shù), 3D模組美術(shù), 貼圖美術(shù), 光照美術(shù), 動(dòng)畫美術(shù)等等
- 遊戲設(shè)計(jì)師, 決定玩法、遊戲方向的重要人物
- 製作人(Producer), 職責(zé)會(huì)因公司有所不同, 有些是管理專案的排程, 有些像是人力資源的主管, 有些則是作為開發(fā)團(tuán)隊(duì)以及事業(yè)單位的聯(lián)絡(luò)窗口 (資金, 法律, 營銷等等), 小公司甚至連製作人都沒有
- 其他員工, 主要是支援開發(fā)團(tuán)隊(duì)的團(tuán)隊(duì), 典型的例子就是IT部門
(編按: 書上副標(biāo)真的給我寫Other Staff..別把IT大大們當(dāng)雜魚啊!他們很辛苦的)
- 發(fā)行商以及工作室, 像是EA, THE, Vivendi, Sony, 任天堂等等. 很多工作室並不隸屬於一個(gè)特定的發(fā)行商, 誰出的方案最好工作室就賣誰. 而有些工作室則是有簽約合作的, 也有像是頑皮狗這種直接隸屬發(fā)行商的工作室
- Runtime引擎架構(gòu)
- 目標(biāo)硬體、裝置驅(qū)動(dòng)
- 作業(yè)系統(tǒng), PC就不說了, 早期的家機(jī)作業(yè)系統(tǒng)是直接編譯到遊戲裡的, 也就是在那時(shí)一款遊戲會(huì)"獨(dú)佔(zhàn)"整臺(tái)機(jī)器, 但現(xiàn)在不同了, 我們都知道家用機(jī)也可以邊玩邊跑背景工作啦~
- 第三方SDK以及中介軟體, 從程式SDK到一些現(xiàn)有的系統(tǒng)都有
- C++ Boost
- DirectX/Vulkan (編按: 書上舉OpenGL, 但我認(rèn)為現(xiàn)在是VK時(shí)代)
- Havok, PhysX
- (編按: Oodle貼圖壓縮、Umbra Occlusion Culling、Wwise音效也被廣泛使用, 所以自製引擎有的時(shí)候也不是100%都從零建起, 如果第三方插件更符合效率及成本那採用了一點(diǎn)也不可恥)
- 核心系統(tǒng), 包含Assertion, 記憶體管理, 數(shù)學(xué)函式庫, 自製資料結(jié)構(gòu)/演算法等等
- 渲染引擎, 架構(gòu)上有很多種不同方法可以使用
- 從Low-Level的Draw Call, Shader到High-Level的Component等等
- Culling優(yōu)化
- 視覺特效, 包含粒子, 貼花, 後製特效等等
- HUD, GUI
- 解析與偵錯(cuò)工具, 主要當(dāng)然是為了捉Bug以及優(yōu)化遊戲, 常見的例子如:
- 程式碼執(zhí)行時(shí)間的測量
- 顯示統(tǒng)計(jì)數(shù)據(jù)
- 將數(shù)據(jù)輸出成文字檔或Excel
- 記憶體使用量追蹤
- 各種類型的偵錯(cuò)訊息, 還要可以分成各種類型來回報(bào)
- 錄製遊戲事件以及重播的能力, 這很難達(dá)成, 但如果做得好將會(huì)是相當(dāng)有價(jià)值的工具
(編按: Forza Horizon系列不只能用來偵錯(cuò), 甚至連遊戲中都能讓你倒帶再來啊!)
- 碰撞與物理, 沒了它遊戲就會(huì)很奇怪, 你可以穿越來穿越去...
- 動(dòng)畫
- HID, 鼠鍵操作或搖桿, 還有針對(duì)遊戲類型發(fā)展出的方向盤組, 釣魚竿, 跳舞池等等
- 音效, 也很重要但相比於渲染, 物理, 動(dòng)畫, AI, 玩法被得到的關(guān)注不多
(編按: 講真的作為玩家, 還真的比較注意作曲合不合, 調(diào)完音量設(shè)定就沒在動(dòng)別的)
- 多人遊玩/連線, 大家都很熟悉了, 古早時(shí)期甚至還有切割螢?zāi)坏淖龇?/li>
- 玩法系統(tǒng), 這個(gè)會(huì)因遊戲類型不同而改變
- 各種編輯器, 管理素材的工具
§Chapter 2 - 工欲善其事, 必先利其器
在研發(fā)引擎之前, 有些工具是必要的可以增進(jìn)效率的, 很短的一章
- 版本管理, SVN, Git, Perforce等等, 萬一專案炸了還可以回溯
- IDE, 當(dāng)然
- 記憶體洩漏以及碎塊偵測
§Chapter 3 - 遊戲軟體工程的基礎(chǔ)
這章進(jìn)入程式部份了, 資工出來的應(yīng)該可以跳掉大部分的內(nèi)容, 都學(xué)過了
- 本書主要聚焦在C++, 介紹了一些物件導(dǎo)向的東西
- 設(shè)計(jì)模式, 作者舉了幾個(gè)例子
- Coding Standards, 可以幫助專案的程式碼提升可讀性, 維護(hù)性, 每個(gè)人流派不同而本書作者認(rèn)為蠻重要的幾點(diǎn):
- 介面乃王! 盡量讓你的.h檔保持簡單乾淨(jìng)最小化, 易懂以及適當(dāng)註解
- 好的命名
- 別什麼都放在全域命名空間, 但也不要過度使用自訂命名空間, 尤其是巢狀太多層
- 跟進(jìn)所有你聽過的C++ Best Practices
- 保持一致性, 修改現(xiàn)有的程式碼, 盡量跟著已存的標(biāo)準(zhǔn)
- 介紹錯(cuò)誤處理, 資料型別等等
§Chapter4&5 - 平行化以及並發(fā)程式設(shè)計(jì)與遊戲中的3D數(shù)學(xué)
又是些資工大二還大三會(huì)學(xué)到的東西
沒有相關(guān)基礎(chǔ)的讀者可以考慮看
(如果有CS底子, 只想單刀直入遊戲引擎系統(tǒng)的部分, 3~5章基本上可以跳過了)
Part II Low - Level引擎系統(tǒng)正式開始
==================================================================
§Chapter6 - 引擎支援系統(tǒng)
任何遊戲引擎都需要一些low-level的支援系統(tǒng), 用來管理乏味但重要的工作
像是引擎的啟動(dòng)、關(guān)閉、設(shè)定、提供各種素材的編輯等等
- 子系統(tǒng)的啟動(dòng)/關(guān)閉, 假設(shè)子系統(tǒng)之間又交互依賴, 那初始化順序一定要注意
- 書上舉了幾個(gè)例子, 像是直接在建構(gòu)/解構(gòu)子做初始化或釋放, 或是實(shí)作startUp()/shutDown()函式
(編按: 我個(gè)人較喜歡後者, 因?yàn)榻?gòu)/解構(gòu)子跟life cycle綁在一起, 我不一定只會(huì)在引擎要被清掉的時(shí)候才shutdown阿)
- OGRE的例子: 宣告了一個(gè)Root Singleton, 裡面包了一堆Manager
- 頑皮狗引擎的例子: 夾雜一堆全域變數(shù)的Init()呼叫且有特定順序
- 記憶體管理
- Stack-Based配置, 讀了一關(guān)就配置記憶體, 一旦配置後就幾乎沒有動(dòng)態(tài)記憶體的配置, 那麼離開了這一關(guān)就把資料都清除掉, 簡單易實(shí)作
- Pool配置, 遊戲引擎相當(dāng)常見的方法之一, 通常會(huì)建立一個(gè)超大區(qū)塊記憶體然後再分給遊戲物件共用
(編按: 這理念用在VRAM也適用, 像是在Vulkan可以建立超大vkMemory物件, 再在有需要的時(shí)候綁定+上傳)
- 記憶體碎塊, 解決方法不外乎過一段時(shí)間就重新定址一次, 把碎塊擠出來集中在一起
- 由於牽涉到記憶體複製, 這個(gè)操作其實(shí)很重
- 所以Divide and Consuer很重要, 不用強(qiáng)求一定要一次搬一大塊, 分成好幾塊/好幾個(gè)Frame來搬
- Container, 遊戲中用到的陣列那些等等, 有些時(shí)候甚至是自製的
- 字串與在地化, 非英語系開發(fā)者都會(huì)面臨的問題
- 引擎/遊戲設(shè)定的存取
- 文字檔, 最常見的方式, 像是OGRE使用了INI, 而JSON, XML也有人在用
(編按: 之前GTA5讀取時(shí)間太長的問題就是JSON檔沒處理好)
- 壓縮過的二元檔, 早期家機(jī)所需, 畢竟那時(shí)儲(chǔ)存裝置不發(fā)達(dá). 而自SNES之後幾乎都有記憶卡帶了, 遊戲設(shè)定有時(shí)候會(huì)跟著遊戲存檔紀(jì)錄在一起
- Windows登錄檔, 作者極不建議這個(gè)方法! 因?yàn)橘Y料可能會(huì)因?yàn)橄到y(tǒng)更新、重灌之類的而損毀
- Command line參數(shù), 像是UE4Editor.exe -run=DataValidation這樣, 根據(jù)Command line (argc, argv)來決定引擎開啟後的動(dòng)作
- 環(huán)境參數(shù)
- 線上使用者檔案, 例如Xbox Live
§Chapter7 - 資源以及檔案系統(tǒng)
遊戲是個(gè)多媒體的體驗(yàn), 那有各種類型的素材要存取也不奇怪
- 檔案系統(tǒng), 會(huì)因OS而有所不同, 但一定包含檔案名稱以及目錄
- 資源管理器, 大致上分為兩種, 第一種管理用來建立並轉(zhuǎn)換成引擎可使用的離線工具, 第二種則是管理Runtime確保資源在被需要之前就讀進(jìn)記憶體、並在不需要的時(shí)候釋放
- 離線資源管理的要求
- 管理多種類型資源的能力 (例如UE4的Content Browser)
- 建立新資源的能力
- 刪除現(xiàn)有資源的能力
- 調(diào)查/編輯現(xiàn)存資源的能力
- 移動(dòng)資源的能力
- 資源間互相參考的能力 (例如一個(gè)material被一個(gè)mesh參考)
- 維護(hù)資源參照的完整性 (例如刪除了正在參考中的資源, 應(yīng)該要把來源都設(shè)定為nullptr)
- 維護(hù)版本歷史的能力, 記錄了誰做了變化以及為何
- 能搜尋素材的話會(huì)很實(shí)用
- Runtime資源管理的要求
- 確保每種獨(dú)立的素材在記憶體裡只有一份 (像是10種不同材質(zhì)用到同一張A貼圖, 這個(gè)A貼圖沒理由要被讀取10次)
- 管理所有資源的生命週期
- 讀取需要的資源/釋放不需要的資源
- 能處理組合型資源, 例如一個(gè)3D模型包含網(wǎng)格、一種或多種材質(zhì)、一張或多張貼圖等等, 也可能有骨骼動(dòng)畫
- 能保持資源參照的完整性
- 管理資源的記憶體使用
- 提供客製化流程, 決定資源讀取後的動(dòng)作 (以UE4為例就是OnPostLoad)
- 假若引擎有支援, 須能處理串流 (非同步讀取)
- 資源建議一定要有類似GUID的識(shí)別碼
- 處理資源之間的交互參考, 挺有挑戰(zhàn)性的
- 例如用GUID來辨別, 資源管理器需要維護(hù)一個(gè)全域的資源查找表, 當(dāng)資源讀入記憶體時(shí), 用GUID作為Key, 並儲(chǔ)存該物件的Pointer. 在交互參考時(shí)進(jìn)行查表即可
- Post-Load的初始化
- 對(duì)於一些狀況是不可避的, 例如讀進(jìn)3D網(wǎng)格後, 為了順利渲染, 必須在網(wǎng)格讀取後建立Vertex Buffer或Index Buffer然後上傳到VRAM
- 一些情況則是可避免但提供一些便利性, 例如在初始化的時(shí)候計(jì)算一些數(shù)值而不用去動(dòng)到素材, 加快測試的速度, 最後再移動(dòng)到離線工具裡
==================================================================
呼~803/1876頁, 下次會(huì)從第八章遊戲迴圈/Runtime模擬繼續(xù)看
今天就讀到這了, 遊戲引擎設(shè)計(jì)可以說是相當(dāng)?shù)淖杂? 各家實(shí)作細(xì)節(jié)也有所不同
但概念上其實(shí)很多是共通的, 開發(fā)者們都在類似的規(guī)則下, 追求神之一手阿