最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

游戲引擎如何設(shè)計與架構(gòu)

2021-10-30 14:03 作者:unity小能手  | 我要投稿

?以前做過游戲引擎,也看過幾個商業(yè)引擎的源碼如Torque等,還有用過一些第三方的引擎來開發(fā)游戲,如Unity, Cocos, Laya等,今天來說一說一款游戲引擎應(yīng)該如何架構(gòu)和設(shè)計,我做了一張圖,如下,接下來講圍繞這張圖分三個層次來給大家講解一個游戲引擎的架構(gòu)與設(shè)計。

OS平臺抽象層

?游戲的本質(zhì)其實就是運行在OS上的一個App,所以游戲使用的各種系統(tǒng)支持和系統(tǒng)調(diào)用都是基于OS的API函數(shù)來完成的。而現(xiàn)在的游戲引擎都要求跨平臺,一次開發(fā)能打包發(fā)布到Android, IOS, Windows, Mac, Linux等。游戲引擎首先會做一個平臺抽象層,這層主要包含兩個方面:

(1)給游戲引擎提供統(tǒng)一接口的OS系統(tǒng)調(diào)用;

(2)是給游戲App打包發(fā)布提供的發(fā)布工具與發(fā)布環(huán)境。

平臺抽象層主要提供以下功能:

? App支持:創(chuàng)建一個游戲窗口,游戲App有個窗口的載體;

?事件支持: 調(diào)用OS的API獲取OS的鼠標(biāo),鍵盤,觸摸,重力感應(yīng)等操作事件;

?聲音支持: 調(diào)用OS的API來播放聲音;

?文件IO支持: 調(diào)用OS的文件操作API,提供文件的讀/寫等功能;

?平臺API調(diào)用支持:調(diào)用手機(jī)相冊等;

?網(wǎng)絡(luò)支持: 調(diào)用OS的網(wǎng)絡(luò)接口來做網(wǎng)絡(luò)通訊;

? SDK支持: 提供SDK的接入的機(jī)制;

? OpenGL支持: 提供平臺的OpenGL環(huán)境的支持;

這些功能對外開放統(tǒng)一的接口給上層調(diào)用,對內(nèi)有不同的平臺都有不同的一套實現(xiàn),所以跨平臺的游戲引擎不同平臺都有對應(yīng)的項目與工程,游戲打包的時候,不同平臺用平臺特有的App工程來打包。有了平臺抽象層,跨平臺這件事情就解決了。為做游戲引擎內(nèi)核打下了堅實的基礎(chǔ)。

引擎內(nèi)核層

?平臺抽象層寫好以后,就基于平臺抽象層提供的OS的接口支撐來做游戲引擎的內(nèi)核,游戲引擎的內(nèi)核包括主要的以下幾大模塊:

?主循環(huán): 游戲引擎其實就是一個循環(huán),大致的偽代碼如下

? ? ?mainLoop() {

?接收輸入,并處理;

?迭代游戲場景中元素的update,處理邏輯;

?提交給GPU,渲染繪制游戲一幀畫面;

?維持合適的幀率,如果CPU有空閑適當(dāng)?shù)男菝摺?/p>

}

?渲染管線與Shader: 基于OpenGL/DirectX等構(gòu)建渲染策略與渲染管線,給用戶提供Shader開發(fā)機(jī)制,渲染策略不一樣,一個游戲引擎可能有多種渲染策略(渲染管線),比如向前渲染,延時渲染,像Unity還有可編程渲染管線,基于可編程渲染管線又推出了高清渲染管線與輕量級渲染管線。每個渲染管線與策略都有對應(yīng)的Shader的機(jī)制來配合,提供一個編寫Shader的機(jī)制給用戶,能做Shader的開發(fā)。

?事件輸入: 接入OS平臺事件,然后來派送事件到具體的節(jié)點或是作為系統(tǒng)事件上報給應(yīng)用層。

網(wǎng)絡(luò)模塊: 游戲開發(fā)中的網(wǎng)絡(luò)就是長連接Socket(H5用websocket)與http協(xié)議,所以這塊我們也要支持好,Socket是OS提供的API,只要通過平臺抽象來調(diào)用就可以了,http我們可以使用一些第三方的庫來做http協(xié)議的編碼與解析。

?文件IO:面對應(yīng)用層提供一些接口出來,然后調(diào)用平臺抽象層的底層的文件IO的系統(tǒng)調(diào)用,來完成文件IO的服務(wù)。

?聲音模塊:面對引用層提供一些接口或組件,然后調(diào)用平臺抽象層來發(fā)出聲音。實現(xiàn)播放聲音文件,支持對應(yīng)的聲音格式,如wav, ogg, mp3等。內(nèi)置這些常用的聲音格式的解碼庫。

?場景管理: 游戲引擎基本上都是基于場景+節(jié)點的模式,節(jié)點在場景中以場景樹的方式組織起來,然后基于這個做好矩陣等相關(guān)數(shù)據(jù)結(jié)構(gòu)與代碼,管理好場景中每個節(jié)點每個物體的位置等相關(guān)的信息。

?組件化開發(fā)模式:目前組件化開發(fā)模式是游戲界主流的一種模式,unity, cocos, Laya都采用這種方式。所以引擎設(shè)計一套組件化的開發(fā)模式機(jī)制,以及開發(fā)出一些公用的組件,比如UI組件或3D骨骼動畫組件等。在游戲引用開發(fā)中這些組件都可以直接使用。同時還會提供一些粒子特效播放等。

?物理引擎:游戲開發(fā)中經(jīng)常要用帶物理引擎來模擬真實的物理計算,目前大部分的游戲引擎的物理引擎都是內(nèi)置第三方的,如: libbullet, PhyX, Box2D等。

?客戶端腳本:腳本系統(tǒng)基本上是一個游戲引擎的標(biāo)配,游戲引擎的內(nèi)核大部分都是基于C++來實現(xiàn),而C/C++代碼開發(fā)難度比較大,為了能降低游戲開發(fā)的門檻,提升開發(fā)效率與速度,一般都會提供腳本語言來開發(fā),就需要內(nèi)置一個腳本解釋器。有些腳本是引擎自己定義的比如Torque,有些內(nèi)置了輕量級的開源第第三方腳本,如Lua,Python, JavaScript等(Unity內(nèi)置的腳本C#)。同時還要把游戲引擎的接口導(dǎo)出來給腳本使用。

這些模塊開發(fā)完成以后,基本上游戲引擎的內(nèi)核就完成了,包含了底層架構(gòu)和給用戶提供開發(fā)模式。給用戶提供的開發(fā)模式機(jī)制,直接決定了你引擎是否好用,主流的現(xiàn)在是組件化開發(fā),所以現(xiàn)在很多游戲引擎都提供的是組件化開發(fā)的機(jī)制。

游戲應(yīng)用層

?游戲引擎內(nèi)核設(shè)計好了以后,基本上就可以基于這個引擎來使用純代碼來開發(fā)游戲了。然而使用這個游戲引擎內(nèi)核第一次做的App并不是游戲,而是游戲引擎編輯器的App?;谟螒蛞鎯?nèi)核開發(fā)一個用戶可以編輯的”游戲”,資源管理,日志管理,屬性查看,編輯器擴(kuò)展,粒子編輯工具等功能的一個工具性質(zhì)的App。有了這個App就可以可視化的編輯游戲場景,動畫,動作,特效等,同時還可以基于這個App來編寫和開發(fā)代碼。這些編輯的場景與資源都生成到資源文件里,運行的時候,游戲引擎內(nèi)核把他們當(dāng)作資源加載運行。最后就是打包發(fā)布,游戲引擎App還會內(nèi)置不同平臺的打包工具,讓用戶直接可以通過App可視化打包,降低開發(fā)難度。游戲引擎編輯器App開發(fā)完成后,就可以正式交付游戲廠商使用,開發(fā)出各種不同類型的游戲。

為什么引擎廠商開源內(nèi)核源碼但不開源編輯器

?最后給大家分享一個游戲引擎行業(yè)的一個有意思的現(xiàn)象,為什么很多游戲引擎可以開源游戲引擎內(nèi)核源碼,但是不開源引擎編輯器源碼呢?比如Cocos, Laya等。這里分為免費游戲引擎與需要授權(quán)的引擎,免費游戲引擎如Cocos, Laya,引擎內(nèi)核代碼直接開源但不開源編輯器,這樣做的理由是開源內(nèi)核代碼你可以定制修改引擎底層代碼與引擎底層的bug。不開放編輯器是大部分的游戲都是基于編輯器做的,如果開放編輯器的源碼,可能一個社區(qū)就會出現(xiàn)很多不同的分支,比如以前cocos-lua的社區(qū)后來又出了一個quick-cocos-lua的社區(qū),這樣讓整個版本的更新迭代不受掌控,有分裂的風(fēng)險。對開發(fā)者來說未必是好事。商業(yè)授權(quán)代碼的引擎,本身商業(yè)授權(quán)就有資金門檻,同時還有保密協(xié)議,相對來說好會更好控制。

?好今天的游戲引擎框架設(shè)計就給大家分享到這里,要做一個好的引擎確實不容易,給引擎廠商點贊,特別是免費的引擎廠商。

?


游戲引擎如何設(shè)計與架構(gòu)的評論 (共 條)

分享到微博請遵守國家法律
东港市| 富源县| 伊宁县| 文山县| 博兴县| 陇西县| 宁武县| 玉溪市| 襄垣县| 景泰县| 库伦旗| 平泉县| 南投县| 瓮安县| 呼图壁县| 九寨沟县| 于田县| 澄江县| 舞阳县| 旬邑县| 内江市| 云林县| 逊克县| 雷州市| 凤阳县| 平江县| 壶关县| 板桥市| 永胜县| 行唐县| 视频| 蓬溪县| 来安县| 安陆市| 成武县| 托里县| 桃源县| 长寿区| 康平县| 南川市| 呈贡县|