自製遊戲引擎 - GameMachine (序)

來自專欄自製遊戲引擎 - GameMachine7 人贊了文章

大概是在幾年前,我在工作之餘接觸了計算機圖形學,彷彿是打開了一個新世界的大門。於是,我開始決定利用自己的空閑時間,寫一個遊戲引擎,其出發點完全是覺得非常有意思,而且遊戲引擎,所涵蓋的面非常廣泛,正好滿足了自己的求知慾。我把這個引擎叫做GameMachine,希望它能夠有朝一日成為真正能夠產出遊戲的機器,從目前看來,它的價值僅僅停留在學習階段,而非真正的生產階段,不過,對於一些簡單的3D遊戲,它還是能夠勝任的。

GameMachine Demo截圖

目前此項目託管在github上:

https://github.com/Froser/gamemachine?

github.com

歡迎大家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還原了雷神之錘3的場景,可以實現奔跑跳躍,支持手柄

物理引擎 (基於bullet3)

骨骼動畫

基於PBR的渲染技術

UI框架

粒子系統

生成地形

目前,功能正在不斷開發中。具體的架構和實現原理,我將會在後面的文章進行分析。

通過編寫GameMachine,可以了解一下方面的相關知識:

語言方面:

1. 了解C++11/14許多特性。如auto, decltype,右值引用,move,完美轉發,甚至還有模板元編程等。這些在代碼中都非常普遍。

2. 深入了解各種容器,如vector, list, map, unordered_map等。它們的應用場景都不一樣,一切是為了最優的效率。

工程方面:

1. 了解設計模式。為了支持多個渲染底層,以及多種操作系統,不得不在一些看似直截了當的功能中加入了一些抽象層,其中用得最多的是工廠模式。不同的渲染底層、操作系統,將會返回不同的實例。

2. 了解渲染的整個流程。這裡指的是窗口的創建過程,消息循環和處理。為了解耦不同操作系統不同的消息機制,GameMachine自己封裝了個事件類來傳遞消息(參考Qt)。

3. 了解圖形渲染管道。在可編程著色管線中,OpenGL3和DirectX11其實是大同小異,因此可以抽象出它們通用的部分,這樣上層渲染時就不必關心底層是用什麼來渲染了。

當然,能夠了解的知識真的太多了,這裡不能一一列舉。但是,我個人從寫了GameMachine以來,受益良多,希望大家能夠多多指教,github的主頁有一個簡陋的構建指南,如遇問題,請多多交流。


推薦閱讀:
查看原文 >>
相关文章