gkENGINE 開發兩年半總結(上)


小刀的由來

gkENGINE,gameKnfie engine,小刀引擎。

這是一個完全個人開發的游戲引擎項目,起源於我的大學畢設。當時是希望開發一個能夠全面支撐畢設游戲的游戲底層架構,同時也磨練一下自己的圖形技術。在畢設游戲開發完成之后,就開始純粹的進行引擎重新架構和開發。到目前為止,斷斷續續,開發了應該有兩年半的時間了。

 

 從2010年9月開始構思畢設,到2011年6月畢設完成,gkENGINE第一版隨着畢設游戲《TANK ZONE》完美收官。

再到2011年7月,開始構思gkENGINE渲染特性擴展。

再到2011年末,對CryENGINE有足夠了解之后,開始對gkENGINE進行徹底重構,實現多線程渲染。

再到2012年中,對gkENGINE進行了跨平台改造,對移動開發環境的學習,部署,成功把gkENGINE搬到IOS和Android平台。同時重構了渲染器,使得其可以以不同的渲染檔次來適配

再到2013年初,經過開發軟渲,以及一系列幾何構建,動態模擬之類的學習積累后。快速的開發了gkENGINE的地形系統,GPU粒子等雛形動能,多線程加載等功能。

再到2013年的現在,開發了測試用例模塊,對資源管理進行了小型重構,渲染效果調優。

 

兩年半的時間,好像從來沒有對小刀引擎進行一個系統的分析。趁着最近這段比較痛苦卻空閑的時間,對小刀引擎進行第一次系統總結吧!

 

引擎特性

 

下面按照慣例,上點圖吧~ 今晚現拉了一個場景,打了幾盞帶假陰影的燈。

圖都是2000px寬的大圖,各位看官可以右鍵在新標簽中看原圖。

1。

 

2。

3。

4。

5。

 

引擎架構

引擎一開始是參考OGRE進行架構的,后來發現OGRE的一些思想過於陳舊,同時接觸了CryEngine,於是重構了目前的這套架構。目前的架構由8個獨立模塊構成。獨立是指:每個模塊完成一部分相對獨立的事務,之間的聯系由抽象的接口維系。各自的內部實現保持獨立。8個工程可獨立編譯,只通過約定的抽象接口進行相互調用。

模塊划分:

目前引擎主干分為8個模塊:

gkRenderer:渲染器

其下目前實現有RendererD3D9和RendererGLES2,細節渲染特性在渲染器內部提供支持。例如shadow, hdr, postmsaa, ssao, deferred lighing等。

gkCore:3D空間內核

其主要實現3D世界的管理,以及各種資源和渲染物件的組裝和統籌,渲染隊列的構建。

gkSystem: 系統模塊

主要負責是整個系統的協調,task處理系統,文件/PAK系統維護,以及和操作系統提供的接口打交道,將其他模塊和平台特性解耦。

gkInput: 輸入模塊

負責各種輸入設備的管理和消息處理,將來自鍵盤,鼠標,手柄,kinect,Android觸屏,IOS觸屏等各種輸入設備的輸入抽象為共有的消息。利用listener模式,為各模塊和游戲邏輯實現提供交互支持。

gkHavok: Havok動畫和物理模塊

目前Havok模塊負責兩塊:動畫和物理。動畫模塊提供ICharacter來提供角色骨骼動作支持,物理模塊提供各種物理層抽象來提供物理支持。

gkPhysics: PhysX物理模塊

PhysX物理模塊單獨實現物理層抽象。

gkGameObjectSystem: 游戲物件系統

游戲物件系統提供了游戲中最基礎節點:游戲物件的管理。采用了component模式,通過各種layer的組合來組裝各種不同類型的gameobject。renderlayer, animlayer, physiclayer, lightlayer等等layer來和其他模塊打交道。

gkGameFramework: 游戲框架

游戲框架建立了一個宏觀的游戲驅動架構,提供一個Igame接口供外部實現游戲邏輯。以快速驅動游戲引擎,快速開發游戲邏輯。

gkLauncher: 啟動器

各平台不同的啟動器負責在各個平台建立游戲框架並驅動引擎。目前實現有gkLauncherWin32, gkLauncherAndroid, gkLauncherIOS。

 

其他模塊:

gkCommon: 接口工程

該工程不參與編譯,是對所有接口的一個歸類和管理。

gkStudio:小刀編輯器

小刀編輯器是一個基於MFC的,使用XTP開發的編輯器架構。提供對游戲場景的編輯。

gkPak: Pak工具

gkPak負責利用平台配置,將各平台所需資源文件 打包/加密/壓縮 為各個平台的資源包。

gkResourceCompiler: 資源編譯工具

資源編譯工具主要負責各種資源的處理,目前提供obj2gmf,tga2dds等源文件到執行資源的資源轉換。

 

 

 頂層接口和設計思路:

頂層的接口設計,就是對模塊划分的一個細化。今天大概的拉了一個圖,把各個模塊的職能接口關系理了一下。

這張圖可從gameobjectsystem的IGameObject這個抽象說起:

首先,一個IGameObject抽象,就代表游戲世界中的一個物體(一個石頭,一個人,一盞燈,一個抽象對象,等等)。

其上使用Component模式,組合了多個IGameObjcetLayer,這些Layer有具體的抽象:渲染層,物理層,動畫層,燈光層,粒子層,xxx層。例如一個石頭,需要一個渲染層和物理層即可;而一個人,則需要多一個動畫層;一盞燈,則需要渲染層和燈光層,或者只需燈光層。

這些Layer,就在各個模塊擁有自己的實現:

例如渲染層,是在GKCORE中實現,創建時加載其所需的各種資源,並按照攝像機和物體的裁剪關系,把他送入渲染隊列,讓渲染器將其渲染出來。

例如動畫層,是在GKHAVOK中實現,創建時加載其所需的各種資源,在更新時更新角色骨骼的數據,將信息填入渲染隊列,讓渲染器將其正確的姿態渲染出來。

例如物理層,是在GKHAVOK中實現,在更新時,根據物理規律,更新其位置或形態,更新渲染層的位置,渲染器最后將其渲染在正確的位置。

等等...

渲染層的具體實現,是這個引擎的圖形部分的核心。放在之后章節具體解析。

 

數據和簡單工作流:

小刀引擎的數據,目前有

幾何網格:.gmf

紋理:.raw .dds .pvr

材質:  .mtl

shader d3d9: .fx .fxb

shader gles2: .vfx .ffx

場景:.gks

動畫文件:.hkx .chr

配置文件:.cfg

打包文件: .gpk

 

目前靜態物體的工作流是:

 

 編寫了一套輕量級的 maxscript + maxplugin的maxport插件組,方便快捷的制作美術資源和(導出場景* 場景編輯也可以直接在MAX中完成)

 

目前的角色工作流是:

角色骨骼動畫方面完全使用了HAVOK提供的便捷工具鏈,異常方便。以后chr的撰寫工作可以制作為max中的工具。

 

文件打包和平台版本更新:

目前開發了一個PAK打包工具,將文件分別用LZMA壓縮(可配置),打包到一個gpk文件中。在引擎中實時的LZMA解壓和加載。

目前的工具集,外部提供了pak工具,資源編譯工具,紋理轉換工具,7z再次打包工具,android的adb工具。

通過windows bat命令集,來調度各種工具,完成對資源的處理,篩選,針對平台打包,向移動平台(android, ios)更新數據包等任務。

 

 一天就這么寫過去了,上節就先寫到這里。下節詳細總結渲染系統的搭建,以及小刀以后的發展想法。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM