標籤:

第一次寫簡單遊戲引擎的經驗教訓總結

教訓:

1. 當初設定目標太高,即使是簡化的Ultima I遊戲所需要的引擎,也是比較複雜的。尤其是還需要構建編輯器的情況下。

2. 在不需要高級演算法的時候,架構和語法就顯得極其重要。架構決定了你能走多遠——即使是這樣一個簡單的遊戲,也需要一個良好的架構,否則寫到一半寸步難行。語法的掌握程度決定了你能夠選擇多少種架構。

3. 急需充值C++語法,尤其是C++ 11/14的語法。因為Stackoverflow上越來越多人用比較純的新標準語法了,不學根本看不懂。

4. 架構是最難辦的,因為搜索不到太多的教程。能夠搜索到的又多半是片段,或者缺乏範例。Github上有很多開源的遊戲引擎,遺憾的是都看不懂,水平還是太差。到底怎麼看代碼,也是值得學習的事情。

5. 目前對於提高架構水平的確沒有什麼好辦法。野生就是這點不好,沒經過系統性訓練,上來就寫代碼容易出問題。

6. 造輪子到底是否必要,目前為止還不敢說。目前造了不少輪子,比如說讀設置文件的程序,不過明顯比較簡陋。

7. 事先規劃比較重要。比如說需要一個統一的設置文件規格,這樣一個庫幾個函數就能夠搞定了,非要寫兩三種,純粹是考慮不周。對於架構也應該事先規劃,但是既然沒有什麼經驗,事先規劃也的確沒用。

8. 引擎和遊戲源文件分開,省的擠在一塊看得眼花繚亂。此外,不用的功能儘早刪除,已經測試過的功能就把測試語句至少注釋掉。其實我還不是特別明白,到底應該如何區分底層引擎和遊戲,但是已經有個概念了。

9. 編輯器裡頭的Undo功能很簡單,就是把前十個地圖快照保存起來,然後往回抽取。有待改進。Command模式?

10. 內存管理一團糟糕,raw pointer滿天飛,經常實現一個功能需要把幾個raw pointer穿透好幾層才能到位,以至於寫destructor的時候糾結的一塌糊塗。這個一半是架構的鍋,一半是沒有用智能指針的鍋。

經驗:

1. 盡量做到data driven是正確的,能夠提出去的都應該提出去。比如說編輯器的按鈕位置明顯是可以拿出去的。

2. 用Factory模式來Spawn entity也是正確的。事實上Factory可以用在很多地方。唯獨麻煩的是需要在load的時候把一些prototype load進去。

3. 抽象出來的一個Effect類也是正確的。比如說怪獸攻擊玩家的時候,就是直接在Effect Manager裡頭push_back一個Physical Damage的Effect,然後遊戲循環中每一幀都會自動按順序執行std::deque裡頭的每一個Effect。以後可以看看能否推廣開來。

4. 在開發中期之後逐漸形成了統一的代碼風格,雖然說不一定好,但是統一的風格是完全必要的。以後要在開發之前就設定統一的代碼風格,省的回頭改。

5. 自己寫GUI的時候,從最一開始的點擊滑鼠->判斷點擊區域->判斷點擊到什麼object->執行某個功能,到目前的點擊滑鼠->傳遞信息給GUI類->判斷點擊到什麼object->執行該object的OnClick()。雖然遠遠還不夠完美,但是有一定進步。

另,強烈建議@vczh@Milo Yip開帖或者開門課專門說下遊戲架構的問題。那本書看了下似乎有些過於龐大,對於我等業餘愛好者來說。。。

推薦閱讀:

遊戲的尋路導航 1:導航網格
C++對象模型(1) 關於對象
C++對象模型(2)構造函數語義學
推薦幾款適合孩子玩的編程遊戲

TAG:遊戲編程 |