http://blog.chinaunix.net/uid-429659-id-3396370.html
新一代MMO架構(gòu)
原文件Pdf下載:
Next_Generation_MMO_Architecture.zip
官網(wǎng)下載:http://www.next-gen.cc/index.php?option=com_content&view=article&id=2&Itemid=3
nextgen架構(gòu)官網(wǎng):http://www.next-gen.cc
翻譯:趙月明
摘要
本文闡述了一種MMO架構(gòu)的實(shí)現(xiàn),架構(gòu)充分利用了微線程和多核處理器,使服務(wù)器能夠承載更多的玩家。本方案使用erlang實(shí)現(xiàn)服務(wù)器集群,并將游戲世界實(shí)現(xiàn)分區(qū)。
I 介紹
MMOG(大型多人在線游戲)讓數(shù)千計(jì)甚至數(shù)以百萬計(jì)的人玩同一個游戲。新一代MMO 將提供一個高動態(tài)的游戲設(shè)計(jì)。讓游戲設(shè)計(jì)者的設(shè)計(jì)充分自由將提升了技術(shù)門檻。
Achterbosch,皮爾斯,西蒙斯(2008),對下一代MMO期望是什么這兒問題調(diào)查了122人。
當(dāng)問及到什么樣的特性是令人滿意的,受訪者提出了一些想法:
作為6.2.1指出的,寧愿玩家影響世界,許多受訪者轉(zhuǎn)而提議:
世界靠其自身的自然環(huán)境事件發(fā)生改變。這些例子包括毀滅森林的火災(zāi),淹沒陸地的洪水,生長的植被,衰減的人類建筑和道路等等。這要創(chuàng)造一個身臨其境的世界,只是增加了晝夜循環(huán)和過去天氣的改變。燃燒的森林可能最終再生,洪水可能平息,還有npc(非游戲角色)可能維護(hù)衰退的地區(qū),以至于世界沒有發(fā)生戲劇性的改變。
另一個有趣但視為不可行的建議:許多受訪者相信他們的角色應(yīng)該能夠產(chǎn)生影響,在游戲世界中,會永遠(yuǎn)完全的改變它。一個任務(wù)中的部分生物和NPC,每一個玩家完成任務(wù)之后都要重置,以便下一個玩家完成同樣的任務(wù)。這通常被稱為重生。
當(dāng)一個被殺的怪在世界里完全健康的重置,被稱為重生。一個參與調(diào)查者提出:開發(fā)者永遠(yuǎn)改變世界,使怪或者任務(wù)不能重生。
問題是:早晚沒有任務(wù)留下,沒有怪獸留下去被殺死。因?yàn)橥婕乙呀?jīng)完成任務(wù),并殺死了所有的怪獸。開發(fā)者必須趕在玩家完成之前,快速的創(chuàng)造出新的任務(wù)。 這是不可能的。
游戲開發(fā)者不斷地創(chuàng)造新的內(nèi)容視乎是不可行的,但是動態(tài)設(shè)計(jì)游戲能夠自動的搜索適當(dāng)?shù)臅r機(jī)建立任務(wù)。
動態(tài)NPC也是一項(xiàng)受訪者期望并有技術(shù)挑戰(zhàn)的特色。受訪者表示,NPC過于靜態(tài),因此在提升游戲真實(shí)體驗(yàn)方面,NPC應(yīng)該進(jìn)行一些日常的活動。如同在單人游戲里一樣被遺忘。
大多數(shù)情況下,友好的NPC晝夜閑站著等待玩家與他們溝通,在這種情況下他們只有一個目的,快速執(zhí)行簡單的一句話,商店購物,或者給玩家一個任務(wù)。敵人的NPC趨向于站著等死。
一個受訪者建議,NPC可以被雇傭,做一些搜集資源保護(hù)建筑物的任務(wù)。
據(jù)一些受訪者所說,NPC除了站立還會有一個目的用途。
另一個受訪者建議:玩家應(yīng)該有NPC敵人的選擇權(quán),用很小的時間間隔來增大預(yù)測難度。就像龍與地下城中的地下城主的情況。
下一代的MMO特性要求架構(gòu)先進(jìn), 允許動態(tài)游戲設(shè)計(jì)、分發(fā)和縮放。在大多數(shù)編程語言中,這是一個難以處理的任務(wù)。要開發(fā)滿足這些需求的服務(wù),需要新工具和編程語言提供更好的支持。
如果這一需求能夠?qū)崿F(xiàn),玩家會有豐富的體驗(yàn),讓他們感覺到在自己的影響下,世界發(fā)生持續(xù)改變。
II 背景
基本上有兩種不同類型的MMOG架構(gòu):服務(wù)器-客戶端模式和點(diǎn)對點(diǎn)。
A客戶/服務(wù)器結(jié)構(gòu)
通過(Cai, Xavier, Turner, and Lee, 2002) 和(Gil, Tavares, and Roque, 2005)的討論,集中服務(wù)器-客戶端實(shí)現(xiàn)是現(xiàn)在最普遍的MMO’S架構(gòu)方案。每個玩家通過客戶端連接游戲服務(wù)。服務(wù)器可以驗(yàn)證客戶端發(fā)送的所有信息和防作弊。,讓服務(wù)器處理所有的事件,可以非常容易的保持世界的一致性狀態(tài)。
問題是在于,當(dāng)玩家連接足夠多時,服務(wù)器將耗盡硬件資源,然后拒絕更多的連接。解決這個問題最常見的方案是:分區(qū),游戲復(fù)制到許多分區(qū)服務(wù)器上,這些服務(wù)器上存儲了數(shù)以千計(jì)的玩家,并維持他們在世界中的狀態(tài)。
負(fù)面效應(yīng)是,玩家基地被孤立的分布在這些服務(wù)器上。意味著如果兩個朋友想在一起玩,他們必須在同一臺服務(wù)器上。另一個問題是平衡人口,如果服務(wù)器有很多玩家,人們不得不等待一個長隊(duì)來登錄。如果一個服務(wù)器玩家很少,人們可能很難有機(jī)會和其他玩家一起玩,這樣就降低了游戲的玩法。
B 點(diǎn)對點(diǎn)架構(gòu)
分散的點(diǎn)對點(diǎn)實(shí)現(xiàn)是通過by (Hampel, Bopp, and Hinn, 2007) 和
(el Rhalibi and Merabti, 2005)提出的,他讓每個客戶端成為一個地理有限區(qū)域的服務(wù)器。這避免了使用集中服務(wù)的伸縮性問題,但很大程度上提升了作弊的風(fēng)險,增大了所有玩家狀態(tài)連貫性維護(hù)的復(fù)雜性。
C Erlang
Erlang 是一個內(nèi)置并發(fā)性的語言,erlang為每一個對象或任務(wù)創(chuàng)建一個輕型進(jìn)程,代替一個連續(xù)運(yùn)行的主循環(huán).每個進(jìn)程都有其自己的主循環(huán)。依賴于硬件,一個普通的桌面計(jì)算機(jī)可以建立數(shù)以萬計(jì)的進(jìn)程。Erlang附帶了一個稱為OTP(開放通信平臺)的平臺。為構(gòu)建服務(wù),OTP提供了通用的設(shè)計(jì)模式:狀態(tài)機(jī)、容錯系統(tǒng)、實(shí)行熱代碼升級。Erlang也有自己的分布式數(shù)據(jù)庫系統(tǒng)Mneisa.如果架構(gòu)用c++或者java實(shí)現(xiàn),這些特色必須從頭開發(fā)或者
借助于第三方庫。 erlang 代碼被組織在被稱為模塊的文件里,模塊里是被寫好的函數(shù)。據(jù)(Nystr?m, 2004)說,選擇erlang為實(shí)現(xiàn)語言,通過使用其輕量級的進(jìn)程就能使服務(wù)器的性能得到顯著提升。
D 理論研究
在近期流行的這些游戲中,有許多對提升MMO的研究。與本架構(gòu)最相關(guān)的是對世界分區(qū)的研究。此研究就是在本章節(jié)中對討論和批評。
有兩個商業(yè)項(xiàng)目Eve Online (CCP) 和 Second Life (Linden Lab)使用了將世界分成子區(qū)域的技術(shù)。
研究論文如(Chen, Wu, Knutsson, Lu, and Amza, 2005), (Yamamoto, Murat, Yasumoto, and Ito, 2005) 和 (Bossche, Verdickt, and Vleeschauwer, 2006)提到以允許架構(gòu)平衡的方式將游戲劃分成一些子區(qū)域。當(dāng)一個子區(qū)域變得有負(fù)載的時候,建議移植到新的服務(wù)器。使用這樣一個伸縮性的限制,一個子地區(qū)的玩家數(shù)量不可能超過計(jì)算機(jī)負(fù)載人數(shù)上限。By assigning the computers to sub areas instead removes this limitation. (聯(lián)系上下文,沒翻譯出來)。所需要的是子區(qū)域狀態(tài)必須分布在指定的計(jì)算機(jī)上。
E 商業(yè)項(xiàng)目
EvE在線是一個發(fā)生在太空的游戲。架構(gòu)將世界劃分為若干子地區(qū)(星系)。集群包括刀片服務(wù)器,也稱為節(jié)點(diǎn)。每個星系駐留在一個節(jié)點(diǎn)上。若干星系可以共享一個節(jié)點(diǎn)。玩家在節(jié)點(diǎn)間無縫轉(zhuǎn)移。當(dāng)一個玩家“跳”到另一個恒星系統(tǒng),一個加載屏幕出現(xiàn)而轉(zhuǎn)移發(fā)生。
據(jù)稱,約60名玩家一起參加戰(zhàn)斗足以搞垮一個節(jié)點(diǎn)。如果節(jié)點(diǎn)移動到一臺專業(yè)的服務(wù)器上,大約能夠負(fù)載大約1000次戰(zhàn)斗或者交換玩家。利用機(jī)器所有的CPU內(nèi)核資源是一個令開發(fā)者感到棘手問題。在集群中,有大約五成的內(nèi)核處于閑置狀態(tài)。?insertref? 是 EvE 服務(wù)器實(shí)現(xiàn)所用的命令式設(shè)計(jì)語言 python的東西。 Python開發(fā)人員稱之為“全局解釋器鎖”。在其內(nèi)部主要部分沒有重新設(shè)計(jì)的情況下,他有效的阻止Python使用多核。
第二人生(游戲名稱)也有類似的地區(qū)服務(wù)器架構(gòu)。當(dāng)無縫轉(zhuǎn)移玩家時,他們穿過了世界。沒有前端集群服務(wù)器為客戶端進(jìn)行通訊。客戶端保持四個連接,連接最近的四個地區(qū)服務(wù)器。
地區(qū)服務(wù)器將所有數(shù)據(jù)流實(shí)時傳給玩家,沒有內(nèi)容保存硬盤,這樣使客戶端會很小。
III 推薦建構(gòu)
如圖1所示:架構(gòu)由四個類型的服務(wù)器通過一個計(jì)算機(jī)集群組成。服務(wù)器由:鏈接服務(wù)器,賬戶服務(wù)器,角色服務(wù)器,區(qū)域服務(wù)器。這些服務(wù)器運(yùn)行在一個計(jì)算機(jī)網(wǎng)絡(luò)(局域網(wǎng))的不同服的計(jì)算機(jī)上。然而這不是必需的,所有的服務(wù)器也可以配置部署在同一臺計(jì)算機(jī)上。服務(wù)器軟件用Erlang實(shí)施,因?yàn)樗哂胁l(fā)、容錯和分布式特性。客戶端通過互聯(lián)網(wǎng)鏈接到鏈接服務(wù)器鏈接服務(wù)器操縱客戶端和其他服務(wù)器之間的通訊。該帳戶服務(wù)器包含用于驗(yàn)證登錄的賬戶信息。所有的玩家角色存儲在角色服務(wù)器上,角色是玩家在游戲中的替身或者實(shí)體。地區(qū)服務(wù)器應(yīng)該運(yùn)行的像一個地理網(wǎng)格連接地區(qū)。如圖2所示, 他們在一起,是一個玩家相互作用的世界。每個服務(wù)器運(yùn)行在一個由名稱、@和主機(jī)名稱組成的節(jié)點(diǎn)上。例如:完整的節(jié)點(diǎn)名稱是start_area@myserver。 start_area是節(jié)點(diǎn)名,myserver是主機(jī)名。節(jié)點(diǎn)名作用于運(yùn)行在不同計(jì)算機(jī)上的服務(wù)器之間的通訊。
A 客戶端
客戶端是運(yùn)行在玩家計(jì)算機(jī)上的程序。通過互聯(lián)網(wǎng)與鏈接服務(wù)器建立鏈接。客戶端是系統(tǒng)中非常重要的部分,但不屬于架構(gòu)的內(nèi)容。只要是能夠建立TCP鏈接,能夠與服務(wù)器發(fā)送和接受數(shù)據(jù)的語言就能實(shí)現(xiàn)。客戶端的目的是通過圖像或者文本接口為玩家展示世界。
B 鏈接服務(wù)器
鏈接服務(wù)器等待客戶端的鏈接,服務(wù)于集群的前端。客戶端從不會直接與其他服務(wù)器直接通訊,所有與客戶端的通訊必須通過鏈接服務(wù)器。為每個客戶端創(chuàng)建一個鏈接進(jìn)程。鏈接進(jìn)程是一個在四種狀態(tài)間變化的簡單有限狀態(tài)機(jī)。
*鏈接狀態(tài):客戶端已經(jīng)建立一個鏈接,但是沒有發(fā)送任何進(jìn)一步的指令請求。
*大廳狀態(tài):客戶端已經(jīng)登錄賬號,瀏覽或者在游戲中建立了實(shí)體。
*玩:客戶端已經(jīng)用一個實(shí)體聯(lián)機(jī),目前正在游戲中玩。
*鏈接丟失狀態(tài):客戶端已經(jīng)失去鏈接。鏈接服務(wù)器保持玩家有效,給他一個再次登錄的機(jī)會繼續(xù)玩游戲。當(dāng)斷開時間超時,鏈接服務(wù)器斷開session并終止。
C 賬戶服務(wù)器
如圖3所示:賬戶服務(wù)器在一個Mneisa數(shù)據(jù)庫中存儲了所有的用戶賬號信息。如圖3所示:賬戶服務(wù)器在一個Mneisa數(shù)據(jù)庫中存儲了所有的用戶賬號信息。通過賬號和密碼驗(yàn)證玩家的合法性。
D 角色服務(wù)器
如圖4所示:角色服務(wù)器存儲了所有的角色數(shù)據(jù)。每個賬戶能創(chuàng)建能夠登陸游戲世界的新角色。服務(wù)器提供了保存和創(chuàng)建新角色的功能。
E 地區(qū)服務(wù)器
地區(qū)服務(wù)器是集群中最復(fù)雜的服務(wù)器。他管理一個世界中的一個地區(qū)。為在地區(qū)服務(wù)器加載完成的每一個角色或?qū)ο螅瑒?chuàng)建一個保存其狀態(tài)的進(jìn)程。圖5闡述此過程。在游戲世界里,每個進(jìn)程有一個通過erlang生成的自定義id和一個作為唯一標(biāo)示id。唯一標(biāo)示id和進(jìn)程id存儲在一個用來查詢對象的數(shù)據(jù)庫中。
F 動態(tài)特性
如圖6所示,地區(qū)服務(wù)器有一個模塊化的構(gòu)建。它核心是僅僅提供了一個簡單事件注冊和啟動與選擇函數(shù)庫的能力。這些庫依次為地區(qū)服務(wù)器提供所有的功能。這些函數(shù)庫在運(yùn)行時,可以編譯、重新編譯、啟動和停止。他們?yōu)殚_發(fā)和測試提供了新類庫,例如一個戰(zhàn)斗系統(tǒng)無需重新啟動服務(wù)器。
架構(gòu)提供了三個默認(rèn)庫:
* libstd:這個庫提供了基本的功能,如注冊/檢索對象、對象記錄和熱代碼升級。
* libchar:這個庫允許角色在地區(qū)服務(wù)器登錄。
*libdist: 這個庫允許一個地區(qū)服務(wù)在集群中跨多個計(jì)算機(jī)分發(fā)。
注意不是直接啟動庫,而是啟動他們的監(jiān)督者。依次啟動庫以及庫運(yùn)行所需要的其他任何進(jìn)程。這樣,模塊libstd_sup提供了一個開始函數(shù)代替libstd。在erlang中,監(jiān)督者是一個監(jiān)督其他進(jìn)程的的進(jìn)程,如果一個進(jìn)程崩潰,監(jiān)督者進(jìn)程會重啟它。下面是一個命令啟動一個庫展示:
- lib_sup:start(libstd_sup).
- =PROGRESS REPORT==== 7-Jul-2009::12:34:09
- supervisor: {local,libstd_sup}
- started: [{pid,<0.270.0>},
- {name,’LibStd’},
- {mfa,{libstd,start_link,[std_funs]}},
- {restart_type,permanent},
- {shutdown,2000},
- {child_type,worker}]
- =PROGRESS REPORT==== 7-Jul-2009::12:34:09
- supervisor: {local,libstd_sup}
- started: [{pid,<0.271.0>},
- {name,’ObjectSupervisor’},
- {mfa,{obj_sup,start_link,[]}},
- {restart_type,permanent},
- {shutdown,2000},
- {child_type,supervisor}]
- =PROGRESS REPORT==== 7-Jul-2009::12:34:09
- supervisor: {local,lib_sup}
- started: [{pid,<0.269.0>},
- {name,libstd_sup},
- {mfa,{libstd_sup,start_link,[]}},
- {restart_type,transient},
- {shutdown,infinity},
- {child_type,supervisor}]
- {ok,<0.269.0>}
用下面的命令關(guān)閉一個庫:
- lib_sup:stop(libstd_sup).
- Ok
另一個動態(tài)特性被稱為熱代碼交換。這使得Erlang在運(yùn)行的同時升級代碼。為此,一個名為upgrade的函數(shù)被添加到類庫libstd。接下來一個例子,對模塊libchar做了修改之后,新的代碼成功編譯,通過以下命令完成升級:
- libstd:upgrade(libchar).
- {module, libchar}
Erlang允許兩個版本的代碼同時運(yùn)行。當(dāng)升級函數(shù)被調(diào)用的模塊作為參數(shù)時,erlang讓當(dāng)前運(yùn)行的代碼為舊的,讓已升級的作為現(xiàn)在的。升級之后,當(dāng)前代碼(新)被使用,原來執(zhí)行舊代碼的所有進(jìn)程,在下個函數(shù)調(diào)用時將被升級。
G 分布
數(shù)臺電腦可以管理同一個地區(qū)服務(wù)器。如圖7中,兩臺分別名為server1和server2的計(jì)算機(jī)運(yùn)行各自名為start_area節(jié)點(diǎn)。運(yùn)行下面的命令,從節(jié)點(diǎn)start_area@server2將關(guān)聯(lián)位于start_area@server1的分布式對象記錄。
- libstd:join(start_area@server1).
- {ok, [start_area@server1]}
分布式對象記錄是一個Mnesia數(shù)據(jù)庫,存儲的信息和本地對象記錄一樣,不同之處是分布式對象記錄不只是包含本地進(jìn)程,還有所有地區(qū)服務(wù)器中的管理同一個地區(qū)的所有進(jìn)程。(不知道翻譯的對不對)
如果start_area@server2往分布式對象記錄中寫數(shù)據(jù),erlang也同樣將修改同步到start_area@server1。erlang進(jìn)程id在本地是透明的,這就意味著如果進(jìn)程運(yùn)行在同一個本地機(jī)器或者同一個網(wǎng)絡(luò)中的另一臺計(jì)算機(jī),他們的通訊是沒有問題的。分布式注冊對象表將start_area@server1和start_area@server2鏈接在一起,這就使他們?nèi)缤谕粋€地區(qū)服務(wù)器上操作一樣。
G1 負(fù)載均衡
libdist庫提供動態(tài)負(fù)載分布的特征
當(dāng)管理同一片區(qū)域的所有服務(wù)器開啟時更新分布式Mnsia表。分布式庫通過檢查本地區(qū)域節(jié)點(diǎn)負(fù)載 與 表中的最少負(fù)載的節(jié)點(diǎn)進(jìn)行對比。如果負(fù)載差值等于或大于1時,則節(jié)點(diǎn)開始將一半的進(jìn)程移動到負(fù)載最小的地區(qū)服務(wù)器上去。
G.2 遷移
分布式的增加,在系統(tǒng)運(yùn)行時,使客戶端沒有任何察覺的情況下,角色在從一臺服務(wù)器遷徙到另一臺服務(wù)器成為可能。下面解釋如何遷移:
如圖8所示,一個對象接收到一個將要遷徙到另外一個節(jié)點(diǎn)的消息。這個消息通常是由分布式庫 libdist 發(fā)送,但也可以通過以下命令從節(jié)點(diǎn)手動發(fā)送。
- ProcessId ! {migrate, start_area@server1}.
如圖9所示:在遷徙目標(biāo)節(jié)點(diǎn),當(dāng)收到一個遷徙消息時,當(dāng)前對象進(jìn)程開始一個帶有相等id和狀態(tài)的新進(jìn)程。新進(jìn)程id被返回到位于start_area@server2上舊的進(jìn)程。當(dāng)一個新進(jìn)程被創(chuàng)建,他覆蓋了當(dāng)前在全局注冊表中擁有自己進(jìn)程id的數(shù)據(jù)條目,因此所有的消息應(yīng)該發(fā)給他自己。
圖10所描
述,這時,即使所有消息仍然發(fā)送給舊的進(jìn)程,舊的進(jìn)程會轉(zhuǎn)發(fā)給新的進(jìn)程。
圖11所示, 如果舊進(jìn)程一秒鐘之內(nèi)無法接受新的消息,將殺死自己,我們認(rèn)為遷移是成功的。
IV 效果
用于測試的服務(wù)器處理器Phenom(tm) II X4 940,8G內(nèi)存。地區(qū)的大小為10000公尺,在一個625公尺的四邊形中,四叉樹將世界拆分成256個四邊形。在測試中,地區(qū)里生成了一些機(jī)器人對象。機(jī)器人大約每7.5秒(5+5秒內(nèi)隨即)前后移動改變方向。
每個動作更新都要發(fā)送給在同一區(qū)塊中的其他機(jī)器人對象,這就意味著與系統(tǒng)中機(jī)器人數(shù)量相比,消息數(shù)量是呈指數(shù)增長的。
A CPU負(fù)載
圖12展示了在系統(tǒng)中機(jī)器人增長同時所有CPU核心的負(fù)載情況。CPU負(fù)載呈指數(shù)增長,當(dāng)24000個并發(fā)機(jī)器人運(yùn)行時,所有的核心負(fù)載都接近了100%。
當(dāng)機(jī)器人達(dá)到24000時,在一個四邊形區(qū)塊中每秒鐘處理1178個消息,在整個地區(qū)服務(wù)器中,每秒鐘處理了301568個消息。
B 內(nèi)存負(fù)載
在圖13中顯示的是鏈接服務(wù)器,角色服務(wù)器、賬戶服務(wù)器和地區(qū)服務(wù)器的內(nèi)存負(fù)載情況。
當(dāng)24000個并發(fā)機(jī)器人運(yùn)行時,地區(qū)服務(wù)器使用內(nèi)存619M的時候。其他服務(wù)器內(nèi)存負(fù)載基本保持不變,仍然在40-43M之間。
C 視覺效果
當(dāng)一個客戶端登陸,大約60-80個機(jī)器人被做了統(tǒng)計(jì)。視覺定時被用來檢查所有明顯視覺延遲。根據(jù)不同的負(fù)載水平,隨即挑選一些機(jī)器人,他們的運(yùn)動變化在iphone上面同步。6000機(jī)器人在地區(qū)服務(wù)器上時,平均運(yùn)動變化時間是7.1秒。(我應(yīng)該估量一下12000和24000個機(jī)器人時的情況,但在機(jī)器人中做了一個日志功能來代替手動計(jì)時。)
V討論
測試數(shù)以千計(jì)的客戶端在現(xiàn)實(shí)的環(huán)境是一個問題,因?yàn)楹茈y獲得如此數(shù)量的計(jì)算機(jī)。從同一臺計(jì)算機(jī)上運(yùn)行數(shù)以千計(jì)的客戶端可能會造成瓶頸,不是每個客戶端都有他們自己的計(jì)算機(jī)。所有的測試計(jì)算機(jī)都通過同一個局域網(wǎng)內(nèi)連接,真實(shí)的生產(chǎn)環(huán)境或許不會是這樣的。當(dāng)從世界各地通過互聯(lián)網(wǎng)連接時,響應(yīng)時間可能會增加。(我還未測試這些)。在這種情況下,服務(wù)器集群的地理位置也會影響到客戶端的響應(yīng)時間。
當(dāng)游戲的特性數(shù)據(jù)向進(jìn)程狀態(tài)增加時,地區(qū)服務(wù)器的內(nèi)存消耗可能會增加。在測試時,地區(qū)服務(wù)器的進(jìn)程中有一個極小的狀態(tài),可以充分的管理角色登陸和遷徙過程。
在沒有檢查探測已經(jīng)登陸的賬戶或者角色,又或者角色是否屬于賬號的登陸之前,賬號和角色登陸序列是不安全的。(感覺沒翻譯清楚。)
將世界劃分在地區(qū)服務(wù)器中可能并不是最好的方案。一個更好的方式是做出一個模型:對統(tǒng)一服務(wù)器做一個繼承,分支出包含區(qū)域/太陽系系統(tǒng)的銀河服務(wù)器,同樣區(qū)域/太陽系系統(tǒng)包含星球服務(wù)器,星球服務(wù)器又被劃分成區(qū)域服務(wù)器。該方法將可以使它通過自上而下的方式更加容易的分發(fā)消息。這將使星際旅行甚至從星球表面到它周圍太空的無縫運(yùn)動變得如此簡單。
VI 結(jié)論和未來工作
以后再翻譯。
原文件Pdf下載:
Next_Generation_MMO_Architecture.zip
nextgen架構(gòu)官網(wǎng):http://www.next-gen.cc
由于本人英文水平太爛,本文完全是為學(xué)習(xí)之用的業(yè)余翻譯。希望對大家有用~~ 文章難免多處錯誤,歡迎批評指正。
若轉(zhuǎn)載,請附上原文鏈接:http://blog.chinaunix.net/uid-429659-id-3396370.html
posted on 2016-03-28 09:01
思月行云 閱讀(559)
評論(0) 編輯 收藏 引用 所屬分類:
MMO