自製遊戲引擎 - GameMachine (序)
自製遊戲引擎 - GameMachine (序)
來自專欄自製遊戲引擎 - GameMachine7 人贊了文章
大概是在幾年前,我在工作之餘接觸了計算機圖形學,彷彿是打開了一個新世界的大門。於是,我開始決定利用自己的空閑時間,寫一個遊戲引擎,其出發點完全是覺得非常有意思,而且遊戲引擎,所涵蓋的面非常廣泛,正好滿足了自己的求知慾。我把這個引擎叫做GameMachine,希望它能夠有朝一日成為真正能夠產出遊戲的機器,從目前看來,它的價值僅僅停留在學習階段,而非真正的生產階段,不過,對於一些簡單的3D遊戲,它還是能夠勝任的。
目前此項目託管在github上:
https://github.com/Froser/gamemachine
歡迎大家fork,參考和學習。如果需要用於生產環境,請務必通知我。
在編寫GameMachine的時候,我遵循著幾點原則:
1、用盡量少的第三方庫。很多基於OpenGL的引擎,作為教學,往往都會使用glut這樣的庫,因為它是支持跨平台的,並且功能比較完善。但是,GameMachine能夠自己寫的代碼,都自己寫。如目前GameMachine已經支持了Windows和X11下的窗口的渲染。只有自己實現,才能滿足自己真正的需求。GameMachine用到的第三方庫主要有zlib、glew、libjpeg、libpng、freetype等,這些庫幾乎用於所有需要圖像渲染的工程,因此沒有必要自己重新實現。
2、設計的時候要考慮到跨平台。GameMachine希望能夠在各種平台上運行,目前已經能夠在Windows和Ubuntu下跑起來(Ubuntu支持的特性目前不全)。因此,它抽象出了很多介面,適應於不同的操作系統。同時,它使用CMake來管理工程,使得任何常見的操作系統都能夠構造解決方案。
3、要能夠支持多種渲染引擎。GameMachine抽象了許多繪製的介面,這些介面已經用OpenGL或DirectX11實現。當然,它也可以支持更多的渲染引擎,如DirectX12和Vulkan。我在編寫渲染代碼時,十分重視它這種擴展的特性。
4、效率優先,大小其次。遊戲引擎渲染出來的畫面要儘可能流暢,本身exe大小大一點沒有關係,畢竟和遊戲資源比起來,exe的大小可以忽略不計了。因此,在編寫的過程中,非常重視一些細節,如:是否能用移動構造代替拷貝構造,是否能避免多次分配內存,內存池是否合理,是否會有內存泄露。
我會在之後逐個來解釋GameMachine是如何實現的。現在先來說一下,GameMachine能做一些什麼事情:
目前,功能正在不斷開發中。具體的架構和實現原理,我將會在後面的文章進行分析。
通過編寫GameMachine,可以了解一下方面的相關知識:
語言方面:
1. 了解C++11/14許多特性。如auto, decltype,右值引用,move,完美轉發,甚至還有模板元編程等。這些在代碼中都非常普遍。
2. 深入了解各種容器,如vector, list, map, unordered_map等。它們的應用場景都不一樣,一切是為了最優的效率。
工程方面:
1. 了解設計模式。為了支持多個渲染底層,以及多種操作系統,不得不在一些看似直截了當的功能中加入了一些抽象層,其中用得最多的是工廠模式。不同的渲染底層、操作系統,將會返回不同的實例。
2. 了解渲染的整個流程。這裡指的是窗口的創建過程,消息循環和處理。為了解耦不同操作系統不同的消息機制,GameMachine自己封裝了個事件類來傳遞消息(參考Qt)。
3. 了解圖形渲染管道。在可編程著色管線中,OpenGL3和DirectX11其實是大同小異,因此可以抽象出它們通用的部分,這樣上層渲染時就不必關心底層是用什麼來渲染了。
當然,能夠了解的知識真的太多了,這裡不能一一列舉。但是,我個人從寫了GameMachine以來,受益良多,希望大家能夠多多指教,github的主頁有一個簡陋的構建指南,如遇問題,請多多交流。
推薦閱讀: