關於遊戲引擎結構上的思考

來源:互聯網
上載者:User

這兩年接觸了一些比較成熟的商業引擎, 慢慢得思想有所轉變

以前總以為, 哪個引擎代碼寫得好看就牛, 太偏激了

很多商業引擎的代碼那叫一個亂~

後來覺得引擎工具很重要, 沒有經過成功項目的引擎不是好引擎

現在呢? 當然工具還是很重要, 但另一個很重要的因素是: 製作效率

能不能快速開發, 能不能快速搭建原型, 快速推出, 靈活定製才是一個引擎最有競爭力的地方

這扯得有點虛了, 來點實際的

在學習並抄襲夠了各種技術細節後, 開始從另一個角度看待一下引擎開發

之前有說過, 引擎可以看作是一個資源管理員, 它的作用是對資源的建立, 編輯, 整合

那這三個大的方面可以從微觀的角度看: 那就是它們都是一些基本元素的組合

拿一個模型來說, 可以拆成網格, 材質, 動畫等, 網格可以拆成拓撲, 頂點, 頂點可以拆成位置, 法線, 紋理座標等, 位置可以拆成float

那麼從上層到底層, 其實就像原子構成分子, 分子再構成各種物質......

轉成引擎術語, 其實就是基礎資料型別 (Elementary Data Type)構成屬性, 屬性構成組件, 組件組成實體, 實體組成情境, 再加上各種行為與事件, 成為一個遊戲

這裡面有三個關鍵的技術點, 那就是反射, 序列化, 組件模式

這三個技術點成就一個成熟引擎所具備的特徵: 資源驅動

反射與序列化方面, C++天生不足, 很多引擎裡壓根沒有系統地去考慮這個

在做功能開發時, 常常會發愁資料怎麼儲存, 怎麼編輯

其實很簡單, 做了序列化, 所有資源的格式可以進行統一, 不用為模型寫一種模式, 地圖寫一種格式, 邏輯表格寫一種格式了

你需要的只是一個Load和和一個Save而已

而序列化也是依賴反射的, 通過遍曆屬性去序列化, 就可以擺脫煩人的save/load/version編碼了

然後是編輯

編輯是強烈依賴反射的, 做好反射機制, 你的編輯器就成功了80%

不管是情境編輯, 還是材質編輯, 甚至於行為, AI, 邏輯, 其實都可以看成屬性編輯

在反射機制的基礎上, 做一個PropertyEditor, 那你的編輯器就基本完成了

你再也不用開發一個功能就到面板上加一個控制項, 改一下儲存/載入的版本號碼了

到這, 引擎已經有一個很好的底層了, 再就是考慮怎麼靈活地去進行遊戲開發

組件模式就是為了資源驅動, 一個實體需要什麼功能就加一個什麼模組

模組的屬性通過PropertyEditor去編輯

對於行為, 可以使用指令碼去實現相應的組件

從這個角度來著, 指令碼也就成了一種可以複用的組件資源

那麼下一步就是弄個強大的指令碼系統, 來配合反射/序列化/組件模式進行開發

好比UE的UnrealScript, Unity3D的UnityScript(Mono), 都是這種結構

對於組件模式, 一個不可缺少的東西就是Prefab, 或者叫Template

因為你所建立的實體都是各種組件的集合, 每次都去一個個的組裝起來很麻煩

所以需要一個模板, 這個模板可以是一個物體, 也可以是多個

這些模板才是傳統引擎中的resource的概念, 由它們去執行個體化出各種實體單位

好了, 有了這些東西後, 剩下的就是美術做內容, 程式寫指令碼, 策劃調數值了

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.