如何從零開始寫一個簡單的遊戲引擎?
假設能使用的基礎庫只有DirectX或者OpenGL。
該問題從這個問題衍生出來:如何從零開始寫一個簡單的操作系統?
2017.7.6更新,引擎完成第一個版本,並開源。
github: scottcgi/Mojoc
================================================
正在用純C寫一個遊戲引擎使用openGL做繪製的,大概有2年了從零開始寫得。基本完成了80%左右了,實現了如下功能:
1. 在c標準庫之上封裝了一個基礎庫,包括動態數組,哈希映射,二進位數據解析,JSON解析器,文件讀寫。定義了一套OOC的style,一些通用設計模式的封裝,一個數學庫包括向量和矩陣相關的計算。
2. 利用openGL封裝了一個繪製層。包括繪製樹結構,精靈繪製和批量繪製,紋理管理,攝像機管理,openGL工具類封裝,著色器的管理,Tween演算法實現和封裝,圖片數據的解析等。
3. 程序層的封裝。包括窗口的管理,層結構與繪製層組裝,事件處理,定時器管理,狀態機行為樹等。
4. 物理引擎。完成了不同形狀的定義和碰撞檢測,碰撞事件回調。碰撞後的物理運動還沒實現。
5. 應用擴展層。實現了一個粒子系統,紋理集合系統,地圖系統和一個骨骼動畫。
基本上實現一個2D遊戲是沒有問題了,未來會加入3D的擴展支持。物理引擎我會繼續做成一個完整的2D系統,以後會是3D的。打算自己實現一個像lua那種尺寸的腳本嵌入。對了,還有就是實現一個ui系統。目前正在邊完善引擎邊利用這個引擎製作遊戲。
下面談談體會和過程,其實體會很多很深,我是空閑時間寫得所以需要很多精力和堅持。寫引擎要有目的性,我是在為製作一個遊戲去做一個引擎,遊戲需要什麼功能,我就去實現什麼功能。實現一個功能需要什麼演算法或是相關的技術,我就去查找和學習。在寫得同時,我看完了好幾本openGL的書,還有著色器方面的,還看了很多演算法和C語言的一些書,有中文的也有英文的關鍵要有激情去推動自己。
平時工作會用到一些開源的引擎包括cocos2dx和libgdx,我也會關注和看一些開源的引擎2D 3D都會看看。但是不會過多的去看實現,我怕影響我得思路,就像寫小說不要過多的閱讀別人的作品會影響自己的風格。我既然自己要寫引擎那麼我要的就是原創。
可能為了實現一款遊戲而製作的引擎不夠通用,通常情況下是這樣的。我在實現不同模塊的時候儘管較勁腦汁也不能預測未來更好的設計可能性。那麼在寫著寫著發現需要重構的時候,就要當機立斷無論推翻多少重寫多少就要立馬去做不要想著實現了功能再說。可以說,寫到現在我刪掉的代碼是寫的3.5倍左右。無論是什麼功能,無論是什麼演算法,無論是什麼設計,只要我發現讓我感覺更好的我就會立馬替換引擎的實現。
我相信慢慢的一點點的,為了實現一個遊戲,到實現了一個遊戲之後,第一個版本的引擎就有了。那麼後面就是一個更精彩的開始。
做一個遊戲引擎,稍微想想就覺得挺複雜了,先羅列出幾個必須要做的模塊:資源和文件管理系統,遊戲主循環,輸入系統,渲染引擎,動畫系統,碰撞系統,遊戲性系統,若是想的再複雜一點,還得加入遊戲相關的調試工具和性能剖析工具。
這樣一來,就很容易陷入過度設計的泥沼,在大三上學期時,我們做的XiHad項目(NextRPG/Xihad · GitHub)就遇到了這樣的問題,引擎的過度設計導致後續的開發時間被無限縮短,最終卻發現引擎中很多的功能實際上遊戲中卻用不到,真是令人哭笑不得。
由於題目中說的是實現一個簡單的遊戲引擎,我給出的建議是:先用OpenGL或者DirectX製作一個簡單的遊戲,再把遊戲中可復用的部分剝離出來,這就成了一個簡單的遊戲引擎。
遊戲史上幾個最著名的遊戲引擎都是這樣做出來的,比如:Quake遊戲引擎是製作雷神之錘的副產品,虛幻是製作戰爭機器的副產品,所以,我相信這種將遊戲引擎作為遊戲的副產品的經驗同樣適用於大型遊戲引擎的開發。感謝選易兄的邀請,邀請的這幾天因為一直工作,直到回校的時候才有比較充足的時間這個問題。那麼如何從零開始寫一個簡單的遊戲引擎?那麼我們首先要想幾個基礎的問題。
一、什麼是遊戲引擎
二、遊戲引擎必要的模塊有哪些
三、要如何學著能製作遊戲引擎
四、如何從零開始寫一個簡單的遊戲引擎
我假設需要「從零開始」寫簡單的遊戲引擎的人不會任何代碼(這樣你就可以不用看了啊別打我),那麼再假設「從零開始」的人不會DirectX或者OpenGL(這樣你也可以不用看了啊別打臉),那麼假設那個人這兩個都會,「這已經不是從零開始做一個遊戲引擎了啊=。=」
所以:如果對代碼或者計算機圖形學,數據結構等不了解的同學,我的建議是,先學會C/C++語言 , 還有DirectX或者OpenGL , 還有數據結構 當然如果你懂彙編語言就更加Nice。
現在的從零開始,就是已經具備了基本的編程能力,基本的計算機圖形學知識,基本的數據結構之下,從無到有製作一個自己的遊戲引擎。
第一個問題來了:什麼是遊戲引擎
在我看來,遊戲引擎其實也就是一個庫,能夠要讓用戶極其方便從頭開始製作一個遊戲。遊戲有兩個部分非常的重要,就是遊戲的畫面與交互。所以遊戲引擎至少要能夠做到圖形渲染,物理碰撞,遊戲邏輯這三大塊的內容,並且還要帶有一個強大的配套開發環境。圖形渲染方面,不同的引擎圖形渲染的能力有所不同,物理碰撞許多引擎會直接使用第三方的專門物理引擎來製作,遊戲邏輯就是對腳本等代碼進行支持,因為純手打所以具體就不粘文檔上來看了。大家可以百度一下虛幻三、寒霜、Unity等。
二:遊戲引擎必要的模塊有哪些
剛才提到的已經是非常成熟的大型遊戲引擎,那麼從無到有的簡單引擎,要做哪些?我個人認為只需要做好圖形渲染就可以了。遊戲其實就是圖形的界面,圖形就是遊戲的重中之重,並不僅僅是「圖形渲染」四個字,其中很多內容可以摳出來講,呈現三角形,呈現模型,貼圖,地形,Shader,粒子,等等等等內容都屬於圖形渲染。
如果你要做一個小的,我建議你做好如下模塊:
精靈類Sprite
動畫精靈類AnimationSprite
按鈕類Button
攝像機Camera
模型GameObject
地形Land
資源管理類ResManager
精靈管理類SpriteManager
渲染管理類RenderManager
輸入Input
聲音Sound
紋理類Texture
遊戲主類Game
把這些模塊做好,你至少能夠創建一個小的遊戲,或者說能夠創建一個可以和玩家順利交互的遊戲。
三:要如何學著製作遊戲引擎,模塊了解方面我推薦 @Milo Yip 先生的《遊戲引擎架構》一書,學習範例我推薦 觸控科技@陳昊芝 的Cocos2d-x來學習。
四:如何從零開始寫一個簡單的遊戲引擎
我同意 @王選易 的答案,你可以先考慮從無到有製作一個小的遊戲,然後把小遊戲的圖形渲染,紋理渲染,資源管理等模塊剝離出來。因為遊戲引擎和你上層代碼的耦合度必須非常的低,這樣你以後的引擎更換可以最少地改動你以前的代碼。
還有好多,現在想到的只有這麼些,我會一直保持更新的。
另外,支持國產遊戲引擎,支持西山居么么噠 :)
你不可能只用D3D或者OpenGL,因為這只是圖形而已。遊戲引擎最起碼還有聲音、輸入設備。實際上,通常還有網路、腳本系統、物理系統。以上只是一個維度。另一個麻煩的維度是內容創建。對於一個正經的遊戲引擎,你不大可能把內容硬編碼在程序里,通常都是作為數據讀進來。而聲音、3D模型等等,在遊戲以外是分割開來的,在遊戲里是有機關聯的。於是,你就需要構建一個內容創建軟體,用來編輯、關聯遊戲內容。這裡面最關鍵的就是:如何把這些東西整合在一起,而這需要實際經驗。所以,你最好先製作一些遊戲,才有足夠的經驗去抽象一個引擎出來。
不要臉地來答這個問題了。。。
首先你得會DX或者OpenGL。。。然後你會。。。
「我擦!不就初始化個框架么?這麼多亂七八糟的預留參數有個JB用!能封裝的封裝!沒什麼用的設為默認函數好了。。。」「我擦!弄個攝像機怎麼也要這麼多參數?!封封封!」「納尼?材質光照什麼的好麻煩、內置幾個好了。。。碼碼碼!」「寫個DEMO測試下好了、卧槽?這裡不應該是這樣啊!改改改!」然後你的DEMO代碼大概會有這麼多:就能跑出這樣的程序:先用OpenGL或者DirectX製作一個簡單的遊戲,再把遊戲中可復用的部分剝離出來,這就成了一個簡單的遊戲引擎。
因為有很多東西是你在寫遊戲的過程中才能遇到的、你只要這時才能真正想到什麼才是一個引擎需要的、這個過程中你的代碼肯定有很多後來加上去的額。。。補丁、可能會有忘了delete的new、很多定義了卻沒用的變數。。。(不要問我為什麼知道、捂臉哭)
最後總歸一句:技術上十幾二十年的差距不是你一個人就能擬補得上的、一味求大求全只會累死自己導致項目夭折(保安!把那個問我為什麼的拖出去!)慢慢從一堵牆變成一間房到一層樓再到摩天大樓比較現實、祝好運
PS:僅菜鳥一枚、請各位大神輕點打臉。。。雖然我長得不怎麼不是。。。一般會問這種問題的,通常都沒正兒八經寫過遊戲,甚至都沒有用現成的引擎完成過遊戲項目
我覺得有兩種路徑
1、先別管什麼引擎,先按照自己的思路寫一些小遊戲,2d的,3d的,然後把遊戲逐漸變複雜,這個過程中總結一下遇到的困難,以及自己能夠想到的解決方案,完善你自己的遊戲,提煉可復用的部分。等練得差不多了,可以去看看「遊戲引擎架構」這本書,了解一下現代工業水平的引擎大致是怎麼做的,對比一下自己的思路。這個時候你自己應該就會有一些想法了。2、用一些現成的工業級引擎做一些小遊戲,譬如unity、ue3、ue4,這個過程中要仔細體會引擎為什麼要這麼設計(特別是工具和工作流的設計),以及具備哪些模塊兒,這些模塊兒是怎麼配合的。然後自己嘗試著山寨一下初學者最重要的是理解引擎是什麼,能夠用來幹什麼,以及引擎帶來的工作流和方法論。實踐層面比較好的方法還是山寨,各模塊具體的實現沒有什麼特別的建議,唯多寫多想多學習
哦對了,寫引擎建議經常從一個使用者的角度來思考,要知道真正的引擎,還有設計師和美術在使用,他們可不喜歡只有程序員才能用明白的工具你只能用OpenGL和DX,要寫遊戲引擎,那隻能用DX了。。。。。
因為OpenGL只是圖形庫而已,遊戲引擎要有聲音吧,要有輸入管理吧。。。遊戲引擎不是圖形庫,應該是一套完整可用工具集合,你要簡單的嘛。。。。AVG遊戲引擎最好寫了。。。。。有在寫一個小遊戲引擎 還是有點發言權的推薦 《遊戲引擎架構》Milo Yip大神翻譯的如果所有的組件都是自己手寫,還是有一定難度的。但是其實難的地方都有庫。個人建議先用庫,把引擎搭建起來先。然後想學習哪些部分就把那個庫幹掉,然後手寫。OpenGL只有渲染所以還是用DX好些。當然,opengl方便移植到移動端。我覺得Panda3D和pygame這種腳本控制的遊戲引擎是一個趨勢,所以還需要一些編譯器前端的知識。當然也可以用lua或者是Python。遊戲引擎包括圖像聲音資源管理物理等等系統…先佔個坑,有電腦了再答。
1、你需要分析出用戶的痛點;也就是,opengl和dx是哪些地方讓用戶使用不方便;
2、改進;比如最早的opengl用戶要使用一個控制項,可能會用畫點畫線功能來做,也就和你在紙上畫一個按鈕一樣,很麻煩的,而且不容易畫好;第一次,你就需要製作一個按鈕,但之後每次你都重畫的話,是不是很麻煩?於是,你把這個按鈕做成模塊化的,以後,每次調用這個模塊就可以了。3、你在長期的工作中,積累的成千上萬的這種功能性模塊;把他們放在一起,就是一個引擎的雛形了!4、將調用方法和代碼風格統一,讓引擎架構適合使用習慣,引擎就慢慢被你搞出來了。。。最後,說著簡單,一個引擎的晚上至少需要3年以上,上百個團隊的使用和改進,這是一個漫長而且複雜的過程。男朋友是程序員,帶團隊做過不少大項目。常被喊大神,三天兩頭有獵頭挖他。上周接單給一家公司做遊戲引擎,他之前沒接觸過引擎,就是半天學會一個軟體和程序語言,連著熬夜4天一個人完成到昨天早上7點,測試無誤並提交項目。感覺他都虛脫了。他就是從完全不會到4天完成學習,並測試無誤。他也在知乎,但一般查問題,不回答問題。他說,這四天連上洗手間都在看教程。拚命學。另外程序員得經常上github社區,號稱全球最大的男性交友論壇,(這比喻有點辣眼睛)至於學習工作,他的諫言是:像螺絲釘一樣專註。訓練自己的忍耐力、抗壓力,工作中學習。保持謙卑。遇到問題就想方設法解決,絕不退縮。所有的學習都是相通的,用自己最擅長的方式去學。(我是電腦小白,馬大哈,有時候電腦開機出問題都不知道怎麼辦?因為他不像正常男朋友一樣幫我去解決問題,而是強迫我去面對自己最頭大的事情,每次遇到問題,心想問他絕對沒戲,也挺心疼他的,為了幫朋友創業,沒有周末,每天至少加班到11點後。工資還是平時一半,還堅持大半年。有很多時候,這使得我硬著頭皮去自己安裝軟體,安裝系統,翻牆,並從大學中依賴老師學習到自己接些小項目。)我們不能老去指望別人告訴我們一個難題。怎麼解決,一個人很多時候還是得自己去多試,試一試,不要怕麻煩,不要怕錯。知道錯的自然就排除了。一個大問題往往是由很多小錯誤積累起來的,學習時把心態放低,很低很低,相信學習一定沒那麼複雜。另外,最關鍵的是:你看的知識永遠都是別人的,你不動手去操作,能力永遠不是自己的。
就那個基於HTML5的網頁遊戲引擎中的碰撞系統我就研究了半天,還不說比較高級的,這真不是一般的人能做的
當你覺得老引擎需要重構的時候.
推薦閱讀:
※為什麼遊戲裡面人物的動作那麼的僵硬?
※使一個3D引擎實現基於物理渲染(PBR)的材質的流程是怎樣的?
※MOBA類遊戲是如何解決網路延遲同步的?
※怎麼做硬核用戶方向的單機遊戲媒體?
※龍與地下城對後世遊戲有哪些深遠的影響?