3D遊戲引擎系列四

2021-07-26 11:24:52 字數 2419 閱讀 2303

筆者介紹:姜雪偉,it公司技術合夥人,it高階講師,csdn社群專家,特邀編輯,暢銷書作者,國家專利發明人;已出版書籍:《手把手教你架構3d遊戲引擎》電子工業出版社和《unity3d實戰核心技術詳解》電子工業出版社等。

在設計引擎時,首先我們要做的是把整個引擎的框架設計好,引擎設計採用的都是模組化開發,這樣既方便介面封裝也便於邏輯層去呼叫,同時降低了模組之間的耦合性。下圖所示的架構:

是本著實用性的角度設計的引擎架構圖,圖中顯示了三部分內容:core底層演算法、engine引擎、game遊戲。引擎架構設計主要是分為core和engine,下面主要介紹引擎的這兩部分。

第一部分是core作為最底層的封裝也對外提供邏輯編寫介面,主要功能包括自定義型別類設計,用於處理引擎所需要的定義型別;視景體封裝主要用於處理相機裁剪,在相機可視範圍內的物體是可視的,在相機外的物體是被裁剪掉,也就是不可視的;遊戲燈光設計是用於照亮遊戲場景,場景中如果沒有燈光是漆黑一片,這個跟現實生活中白天和黑夜類似。在該引擎中實現了三種型別的燈光,材質主要是通過照射在物體表面的光照反射體現的。引擎底層涉及到很多矩陣和向量的轉換運算,固定流水線核心就是矩陣之間以及矩陣和向量之間的轉換。

第二部分是engine的封裝也是作為遊戲邏輯的介面,最終跟ecore工程一樣編譯成靜態庫或者動態庫用於編寫遊戲邏輯呼叫。實現功能包括遊戲場景中相機的封裝,在engine層實現的相機類將呼叫ecore層的視景體介面實現裁剪功能。圖形繪製功能介面主要是用於繪製遊戲場景的物體,輸入介面處理的是使用者與遊戲互動操作;3d遊戲引擎提供支援3d模型的載入以及讀取功能;遊戲物件類是場景中所有物體物件的父類,在邏輯層實現的具體物件類都需要繼承該類。另外遊戲執行時必須要有遊戲視窗,遊戲視窗的定義是在引擎內部實現的。遊戲中所有的元素都是場景管理類建立出來的,比如關卡,燈光,模型,文字資訊等。最後使用引擎介面去實現一款小遊戲,下節的任務是在該架構設計的基礎上對功能模組繼續細分。

模組功能細分主要分為兩步:第一步先把遊戲開發中使用的主要模組劃分好,不需要考慮細節;第二步再在第一步的基礎上把功能模組細分,這麼做也是為了給團隊成員分配任務,在細分的過程中再完善第一步的模組增加一些細節,通過以上兩步就可以把遊戲架構實現出來。說起來簡單,做起來難,要能熟練的運用架構思想需要開發者不斷的去開發產品積累經驗。不論什麼遊戲產品都需要引擎的支援,比如現在市面上比較流行的引擎cocos2d-x、unity3d、ue4等引擎,引擎的效率也直接影響了遊戲執行的效率,本書實現引擎架構的方式是把對物體渲染、事件輸入、相機、場景、模型等這些主要的模組進行封裝。對模組細分的目的主要是便於協同程式設計開發同時減少模組之間的耦合性。再此多強調一點,在遊戲公司多人協同開發時,特別是在提交**時經常會出現**衝突,如果經常發生這種事情,這說明對於模組的劃分方面需要再仔細考慮一下。有的人可能會問,如果對模組細分還是達不到要求咋辦?還有一種方法可以幫你完善架構,就是**重構。**重構就是把以前寫的**有設計不好的模組重新編寫,**重構有幾個原則:採用區域性重構,不要做整體重構。整體重構風險不可預估,因為整個遊戲是多人開發,涉及功能模組太多,乙個人在短時間內很難完成。另外如果產品要上線了,此時不可做重構。還有重構的目的是讓**執行效率更高,**更容易擴充套件,閱讀**比較方便,千萬不要因為重構把以前的功能改變了,這樣的重構不要也罷。模組細分架構如下圖:

本書引擎利用3d固定流水線實現了引擎的整個渲染流程,在渲染物體的過程中為了優化效率使用了渲染列表,把沒有被相機剔除的物體插入到渲染列表中,然後對物體進行背面消除。對渲染列表中的物體執行3d固定流水線流程,首先進行的是世界座標到相機座標變換,再從相機座標到透視座標變換以及從透視座標到螢幕座標變換,從優化角度考慮,渲染列表中的物體會按照一定的規則進行增加和刪除操作,最後將存在渲染表中的圖繪製出來,這也是本書引擎最核心的思想。渲染流程如下圖:

本章主要是告訴讀者在模組劃分時需要細緻考慮,遊戲文字的繪製採用的是gdi圖形裝置介面,整個渲染流程採用的是渲染列表進行處理。模組劃分的思想這對於開發遊戲邏輯也是適用的,在公司裡面很多程式設計師在做開發時拿過策劃案子,不假思索的就開始寫邏輯,因為大家心裡著急,只想著快速實現功能,可能在比較短的時間寫完了。但是遊戲的需求會經常變化,寫的邏輯框架必須能適應不斷的需求變化,這就要求在寫**之前全面仔細的把問題思考完整,思考的時間盡量長一些,思路清晰了,**寫起來很快的。在此分享一下經驗:我做遊戲開發時主要分三步:第一步先把案子從頭到尾看一遍,對於不懂的地方跟策劃去溝通,因為在溝通的過程中,可以幫你解答很多疑惑。第二步把整個策劃案子通過畫架構圖或者說模組圖理順一下思路。第三步對功能模組再進行細分,這個細分程度是可以根據它寫**的。完成這三步後,再寫**就非常簡單了。架構思想講完了,接下來開始進入**編寫的實質性階段。

3D遊戲引擎系列一

筆者介紹 姜雪偉,it公司技術合夥人,it高階講師,csdn 社群專家,特邀編輯,暢銷書作者,國家專利發明人 已出版書籍 手把手教你 架構 3d遊戲引擎 電子工業出版社 和 unity3d 實戰核心技術詳解 電子工業出版社等。為了能讓開發者重視引擎開發,最近一直在寫一些關於學習引擎的一些博文,為此還...

3D手機遊戲引擎

一,寒霜2引擎 frostbite 2 engine 但手機上貌似不支援 二,虛幻3引擎 unreal engine 3 沒用過 三,unity 引擎 本人使用過 以上3d引擎我推測應該都是基於 opengl es2.0圖形庫支援嵌入式裝置。2d手機遊戲引擎 一,cocos2d x cocos2d ...

3D遊戲引擎設計與實現(3)

經過幾天編寫,3d遊戲引擎的架構 大體架構已經搭好。下面來每個模組說明 l 引導程式 engine mm3dmain.exe l dll管理模組 engine bin mm3drun.dll l 引擎管理模組 engine bin mm3dengine.dll l ui模組 engine bin m...