ETH官方钱包

創(chuàng)作內(nèi)容

11 GP

Game Engine Architecture閱讀筆記(上)

作者:巧克力喬斯達(dá)│2023-04-03 22:32:12│巴幣:2,116│人氣:348
新的一年,又拿到了五天學(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ī)則下, 追求神之一手阿


引用網(wǎng)址:http://www.jamesdambrosio.com/TrackBack.php?sn=5690522
All rights reserved. 版權(quán)所有,保留一切權(quán)利

相關(guān)創(chuàng)作

留言共 0 篇留言

我要留言提醒:您尚未登入,請先登入再留言

11喜歡★ltes50414 可決定是否刪除您的留言,請勿發(fā)表違反站規(guī)文字。

前一篇:UE4 - Skelet... 後一篇:Unheard Engi...


face基於日前微軟官方表示 Internet Explorer 不再支援新的網(wǎng)路標(biāo)準(zhǔn),可能無法使用新的應(yīng)用程式來呈現(xiàn)網(wǎng)站內(nèi)容,在瀏覽器支援度及網(wǎng)站安全性的雙重考量下,為了讓巴友們有更好的使用體驗(yàn),巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現(xiàn)和功能。
屆時(shí)建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業(yè)系統(tǒng)版本才可使用)

face我們了解您不想看到廣告的心情? 若您願(yuàn)意支持巴哈姆特永續(xù)經(jīng)營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學(xué)】