Unity多人同時(shí)在線海量玩家角色的架構(gòu)與設(shè)計(jì)
Unity多人同時(shí)在線的游戲會(huì)有很大的地圖,大量的玩家同時(shí)在線,以及玩家會(huì)有不同的游戲職業(yè),這樣眾多的玩家游戲角色我們客戶端應(yīng)該如何來(lái)設(shè)計(jì)呢?本文來(lái)分享以下幾個(gè)點(diǎn):
? (1) 每個(gè)網(wǎng)絡(luò)玩家角色是一個(gè)GhostCharactor;
(2) 網(wǎng)絡(luò)玩家角色的創(chuàng)建與刪除,由GhostEntityMgr統(tǒng)一管理;
(3) 網(wǎng)絡(luò)玩家的性能優(yōu)化要注意的事項(xiàng);
?
每個(gè)網(wǎng)絡(luò)玩家角色是一個(gè)GhostCharactor
?
多人同時(shí)在線(2000+玩家在同一個(gè)地圖上游戲)的網(wǎng)絡(luò)游戲,我們都是基于狀態(tài)同步來(lái)進(jìn)行處理的,這類游戲中的玩家我們可以分成兩類: 一類是其它玩家通過(guò)網(wǎng)絡(luò)控制的角色,一類是當(dāng)前玩家控制的角色(我們稱self玩家)。我們做多人同時(shí)在線的游戲都是基于狀態(tài)同步,即在服務(wù)器上會(huì)跑一個(gè)完整游戲邏輯,然后有狀態(tài)改變了,就發(fā)送”最新的狀態(tài)”給能看見(jiàn)這個(gè)玩家的其它網(wǎng)路網(wǎng)絡(luò)玩家??蛻舳耸盏阶钚?tīng)顟B(tài)的數(shù)據(jù)包后,根據(jù)數(shù)據(jù)包的內(nèi)容來(lái)做對(duì)應(yīng)的動(dòng)作與處理,比如收到死亡的狀態(tài)事件,播放死亡動(dòng)畫(huà)等。也就是說(shuō)所有的角色,最終都是通過(guò)服務(wù)端發(fā)送過(guò)來(lái)的網(wǎng)絡(luò)事件來(lái)驅(qū)動(dòng)的。一個(gè)網(wǎng)絡(luò)游戲角色,其實(shí)就是一個(gè)基于網(wǎng)絡(luò)事件驅(qū)動(dòng)的角色鏡像(下文我們稱ghost)。
Ghost負(fù)責(zé)處理各種網(wǎng)絡(luò)事件,然后根據(jù)網(wǎng)絡(luò)事件來(lái)實(shí)現(xiàn)對(duì)應(yīng)事件的處理邏輯。所以我們?cè)谠O(shè)計(jì)的時(shí)候編寫(xiě)一個(gè)GhostCharactor的對(duì)象組件,用來(lái)專門(mén)響應(yīng)和處理網(wǎng)絡(luò)角色對(duì)應(yīng)的網(wǎng)絡(luò)事件, GhostCharactor再調(diào)用對(duì)應(yīng)的功能組件,完成特定的功能。所以成千上萬(wàn)的游戲玩家對(duì)象都可以使用GhostCharactor來(lái)根據(jù)網(wǎng)絡(luò)事件來(lái)控制客戶端本地角色同步狀態(tài)與展示動(dòng)畫(huà)。玩家自己的角色對(duì)象也可以是一個(gè)GhostCharactor。
?
大量玩家角色的創(chuàng)建與刪除,由GhostEntityMgr統(tǒng)一管理
上面分析了多人同時(shí)在線游戲中的每個(gè)角色都可以用GhostCharactor來(lái)做控制,那么這些角色都可以通過(guò)GhostEntityMgr管理對(duì)象來(lái)進(jìn)行構(gòu)建與回收。多人游戲同時(shí)在線的時(shí)候,會(huì)有大量的玩家創(chuàng)建與刪除,這個(gè)時(shí)候我們使用GhostEntityMgr,來(lái)做內(nèi)存池來(lái)進(jìn)行網(wǎng)絡(luò)游戲角色的創(chuàng)建與刪除。
創(chuàng)建一個(gè)網(wǎng)絡(luò)玩家角色需要實(shí)現(xiàn)以下幾個(gè)點(diǎn):
a: 玩家角色的節(jié)點(diǎn)創(chuàng)建, 根據(jù)玩家的職業(yè),來(lái)選擇要?jiǎng)?chuàng)建的游戲角色預(yù)制體來(lái)實(shí)例化角色;
b: 創(chuàng)建一個(gè)GhostCharactor組件對(duì)象到玩家角色節(jié)點(diǎn)上,實(shí)現(xiàn)所有網(wǎng)絡(luò)游戲角色的事件處理邏輯;
c: 在GhostCharactor里面把一些功能性的組件都添加到玩家節(jié)點(diǎn)上:技能攻擊,導(dǎo)航組件等。GhostCharactor來(lái)調(diào)用這些功能組件來(lái)完成特定的功能;
d: 客戶端GhostCharactor統(tǒng)一處理服務(wù)器發(fā)過(guò)來(lái)的對(duì)應(yīng)角色的網(wǎng)絡(luò)事件;
e: 對(duì)于是本機(jī)玩家操作的網(wǎng)絡(luò)角色, GhostEntityMgr除了給這個(gè)節(jié)點(diǎn)添加GhostCharactor以外還會(huì)添加玩家操作組件PlayerOpt,主要是將玩家的操作發(fā)送給服務(wù)器。服務(wù)器接收到事件后,計(jì)算最新的狀態(tài),把改變的狀態(tài)通知給對(duì)它感興趣的客戶端。
f: GhostCharactor設(shè)計(jì)一個(gè)保存玩家的游戲數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),比如hp, attack等,
看下整個(gè)架構(gòu)圖,如下:
?

網(wǎng)絡(luò)玩家性能優(yōu)化注意的一些事項(xiàng)
?
Unity客戶端做多人網(wǎng)絡(luò)在線的時(shí)候,我們優(yōu)化的時(shí)需要注意以下幾個(gè)點(diǎn):
a:?內(nèi)存池來(lái)管理玩家對(duì)象;
由于MMORPG等多人同時(shí)在線的游戲都會(huì)有AOI的區(qū)域,就會(huì)頻繁有網(wǎng)絡(luò)玩家進(jìn)入AOI區(qū)域與離開(kāi)AOI區(qū)域,這樣就會(huì)導(dǎo)致在客戶端頻繁的創(chuàng)建與刪除一個(gè)網(wǎng)絡(luò)玩家對(duì)象節(jié)點(diǎn),所以一般我們會(huì)基于內(nèi)存池來(lái)管理玩家對(duì)象,這樣讓玩家對(duì)象能快速的創(chuàng)建與刪除。
b:?玩家的血條昵稱等UI元素優(yōu)化
注意一下玩家的UI元素的drawcall,同時(shí)把UI元素盡可能的合批降低drawcall,同時(shí)血條與玩家昵稱會(huì)改變,所以最好角色UI元素放在單獨(dú)的一個(gè)Canvas下。
c:?角色的動(dòng)畫(huà)盡量使用Animator動(dòng)畫(huà)狀態(tài)機(jī)來(lái)做
新版的角色動(dòng)畫(huà)狀態(tài)機(jī)Animator內(nèi)部能發(fā)揮多線程優(yōu)勢(shì),比Animation性能更好,所以做角色的時(shí)候盡量使用Animator來(lái)做動(dòng)畫(huà)狀態(tài)機(jī),播放動(dòng)畫(huà)與動(dòng)畫(huà)切換。
d:?發(fā)送給服務(wù)器的數(shù)據(jù)先在本地做好校驗(yàn)數(shù)據(jù)合法性校驗(yàn),再發(fā)往服務(wù)器。
游戲程序運(yùn)行中得到的發(fā)送給服務(wù)器的數(shù)據(jù)可能并不符合要求,作為客戶端,發(fā)送數(shù)據(jù)給服務(wù)端之前盡量的保證數(shù)據(jù)的合法性,避免去沖擊服務(wù)器,雖然服務(wù)器也要校驗(yàn)。
e:?戰(zhàn)斗過(guò)程中做好日志與錄像,方便bug追蹤與分析。
大型多人同時(shí)在線的游戲會(huì)有大量的玩家創(chuàng)建與刪除,同時(shí)有大量的數(shù)據(jù)過(guò)來(lái),我們?cè)谔幚砭W(wǎng)絡(luò)數(shù)據(jù)的時(shí)候要做好狀態(tài)的日志,方便我們分析。
f:?根據(jù)手機(jī)設(shè)備的高中低端,針對(duì)性能來(lái)對(duì)渲染效果進(jìn)行定制。
獲取當(dāng)前的手機(jī)的機(jī)型,判斷屬于哪類機(jī)器,根據(jù)機(jī)器的高中低分類來(lái)決定哪些特效與陰影等細(xì)節(jié)是否顯示出來(lái),最大限度的保持游戲的流暢性。
?
還有其它的優(yōu)化的事項(xiàng),根據(jù)具體實(shí)際項(xiàng)目中的問(wèn)題來(lái)進(jìn)行分析與優(yōu)化。
?
本節(jié)的內(nèi)容就分享到這里了,關(guān)注我,學(xué)習(xí)更多的網(wǎng)絡(luò)游戲開(kāi)發(fā)的知識(shí)。
我的學(xué)習(xí)交流Q群425-908-678 ,里面有更多學(xué)習(xí)資料與素材源碼,歡迎進(jìn)群領(lǐng)取