五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

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

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

2021-10-12 19:15 作者:博毅創(chuàng)為  | 我要投稿

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

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

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

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

平臺(tái)抽象層主要提供以下功能:

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

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

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

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

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

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

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

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

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

引擎內(nèi)核層

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

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

??????mainLoop() {

???????????接收輸入,并處理;

???????????迭代游戲場(chǎng)景中元素的update,處理邏輯;

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

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

}

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

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

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

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

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

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

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

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

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

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

游戲應(yīng)用層

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

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

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

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

更多教學(xué)資料:https://bycwedu.vipwan.cn/promotion_channels/829468798?

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

分享到微博請(qǐng)遵守國家法律
乌审旗| 集贤县| 万年县| 桃园县| 正宁县| 腾冲县| 黔江区| 武城县| 大荔县| 中方县| 明光市| 宣恩县| 平阳县| 中卫市| 衡阳县| 洪泽县| 永修县| 龙海市| 泌阳县| 长春市| 达拉特旗| 基隆市| 永兴县| 普兰店市| 内黄县| 林西县| 仙居县| 通辽市| 德兴市| 肇州县| 宣武区| 东明县| 清河县| 西峡县| 玛曲县| 新巴尔虎右旗| 江源县| 石阡县| 青铜峡市| 襄樊市| 都江堰市|