專利名稱:一種事件驅(qū)動網(wǎng)絡(luò)游戲服務(wù)器的實(shí)現(xiàn)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及網(wǎng)絡(luò)游戲服務(wù)器的事件處理,特別是一種利用事件驅(qū)動網(wǎng)絡(luò)游戲 服務(wù)器的實(shí)現(xiàn)方法。
背景技術(shù):
在一個網(wǎng)絡(luò)游戲中,有著各種各樣的對象,比如玩家、怪物、非玩家控制角 色、地圖等,我們則將游戲世界中的如玩家(Player)、怪物(Monster)、非玩家 控制角色(None Player Character,即NPC)、地圖(Map)等等統(tǒng)稱為對象,這些 對象發(fā)生的各種活動統(tǒng)稱為事件。正是這些對象接受或觸發(fā)了各種各樣的事件 才產(chǎn)生了交互,才構(gòu)成了這個世界里的各種行為。網(wǎng)絡(luò)游戲?yàn)橥婕姨峁┝艘粋€平 臺,在這個世界中的一切活動,比如撿取、丟棄、使用、買賣、聊天、PK等等
都是在這個平臺上完成。處理這一系列行為的傳統(tǒng)手段是服務(wù)器開啟以后,不
停地輪詢每一個對象,檢查是否有事件發(fā)生,若有事件發(fā)生則調(diào)用相應(yīng)的方法(游 戲規(guī)則)處理對應(yīng)的事件。傳統(tǒng)服務(wù)器就是這樣為了響應(yīng)每一個玩家的動作和游 戲世界的事件, 一個周期需要輪詢每一個玩家、怪物、非玩家控制角色、每一張 地圖。
但是傳統(tǒng)手段的弊端在于不論這些對象是否有事件發(fā)生,服務(wù)器都將主動輪 詢這些對象。 一個大型的網(wǎng)絡(luò)游戲,這樣的對象往往成千上萬,每個對象對應(yīng)的
事件也是相當(dāng)龐大的,這種手段存在極大的浪費(fèi)。假如這個服務(wù)器上有5000個玩 家,將逐個輪詢這5000個玩家,處理他們相關(guān)的事件;同樣,假如有200張地圖, 也將逐一輪詢, 一個個觸發(fā)或處理對應(yīng)的事件。比如怪物或非玩家控制的角色的
尋路、攻擊等。實(shí)際情況是在某一時刻,可能只有部分玩家只觸發(fā)了一個或幾
個動作,而我們卻輪詢了全部玩家的所有動作;同樣,可能在某時刻這張地圖根 本沒有玩家(這種情況我們將在后面分析到),但是服務(wù)器仍然在處理這張地圖上 的對象(比如大量的非玩家控制的角色、怪物)。因此,維持這個龐大虛擬世界的 流暢運(yùn)行會受到硬件、網(wǎng)絡(luò)資源的制約,同時傳統(tǒng)服務(wù)器模型存在浪費(fèi)資源的現(xiàn)
象,單個游戲世界規(guī)模有限,所做的無用功大量消耗服務(wù)器資源,嚴(yán)重阻礙服務(wù)
器承載量,從而增加運(yùn)營成本。
發(fā)明內(nèi)容
本發(fā)明提供了一種可以有效解決不做無用功問題的利用事件驅(qū)動網(wǎng)絡(luò)游戲服 務(wù)器的實(shí)現(xiàn)方法,可以大量節(jié)約服務(wù)器資源,減小服務(wù)器承載量。
一種利用事件驅(qū)動網(wǎng)絡(luò)游戲服務(wù)器的實(shí)現(xiàn)方法,其特征在于通過事件驅(qū)動 服務(wù)器根據(jù)事件源將事件分為三種類型,事件驅(qū)動服務(wù)器包括每種事件類型對應(yīng) 的獨(dú)立處理器;當(dāng)事件源的消息來到游戲服務(wù)器時,事件驅(qū)動服務(wù)器中的事件產(chǎn) 生器就對到來的消息進(jìn)行封裝處理并產(chǎn)生一個事件,然后由事件驅(qū)動服務(wù)器中的 事件分配器將產(chǎn)生的事件分配給相應(yīng)的處理器進(jìn)行處理。
所述事件源包括IOCP層的Player Event,即來自客戶端玩家網(wǎng)絡(luò)消息觸發(fā) 的該玩家的事件;Script Manger產(chǎn)生的事件,即服務(wù)器腳本產(chǎn)生的事件,比如服 務(wù)器定時要發(fā)生的事件, 一些在游戲地圖中游走的非玩家控制角色等;收到各個 事件處理器產(chǎn)生的事件。
采用IOCP (Windows平臺下的網(wǎng)絡(luò)通信模型完成端口模型)的網(wǎng)絡(luò)層,用 于接收客戶端發(fā)來的消息;Script Manger,服務(wù)器的腳本管理,用于根據(jù)腳本產(chǎn) 生的服務(wù)器事件。
所述根據(jù)事件源將事件分為三種類型PLAYER_EVENT,玩家相關(guān)的事件; MAP—EVENT,地圖相關(guān)的事件;GS—EVENT,服務(wù)器事件。
所述三種類型事件對應(yīng)的處理器為PLAYER—EVENT對應(yīng)的Player Event Processor ,玩家事件處理器;MAP—EVENT對應(yīng)的Map Manger,地圖管理器;GS_EVENT 對應(yīng)的GS ^vent Processor,全局事件處理器。
所述事件和對應(yīng)的處理器也可以根據(jù)實(shí)際情況所需進(jìn)行擴(kuò)充。
IOCP層的消息只會觸發(fā)PLAYER_EVENT事件,這種類型的事件用于通知服務(wù)器 該玩家網(wǎng)絡(luò)層有消息,由Player Event Processor模塊去取出玩家的消息進(jìn)行處 理;Script Manger模塊觸發(fā)GS_EVENT事件,由GS Event Processor處理服務(wù)器 本身觸發(fā)的一些全局性的事件,比如廣播等等;M印Manger用于管理地圖列表, 并處理地圖中的怪物、非玩家控制的角色、掉在地上的物品等對象。
所述事件產(chǎn)生器和事件分配器接受從IOCP、 Script Manger及各事件處理器 產(chǎn)生的事件,負(fù)責(zé)事件的產(chǎn)生和分配。.所述Player Event Processor, Map Manger禾口 GS Event Processor3個事 件處理器也會產(chǎn)生PLAYER_EVENT, MAP—EVENT和GS—EVENT這3種類型的事件。
所述Player Event Processor, Map Manger禾口 GS Event Processor3個事 件處理器中再次產(chǎn)生了事件,這個事件將被發(fā)送到事件產(chǎn)生器進(jìn)行封裝,然后又通 過事件分配器進(jìn)行分配,最后仍然通過各個事件處理器進(jìn)行處理,如此往復(fù)。
所述事件產(chǎn)生器和事件分配器或者Player Event Processor, Map Manger
和GS Event Processor3個事件處理器中的任意一個模塊都采用被動方式工作, 只有消息或事件到來事件產(chǎn)生器才產(chǎn)生對應(yīng)事件,當(dāng)有事件到來分配器才進(jìn)行分 配,同樣每個事件處理器也只有事件到來才進(jìn)行處理。 本發(fā)明的有益效果-
事件驅(qū)動的服務(wù)器只處理已經(jīng)觸發(fā)的事件,達(dá)到避免做大量無用功的目的,
可以大量節(jié)約服務(wù)器資源,減小服務(wù)器承載量,提高了服務(wù)器效率,擴(kuò)大游戲世界,
增加運(yùn)營成本。
圖1為本發(fā)明的事件驅(qū)動服務(wù)器的結(jié)構(gòu)示意圖
圖2為本發(fā)明實(shí)施例4所述根據(jù)視距驅(qū)動地圖的示意圖
圖3為本發(fā)明實(shí)施例4所述玩家驅(qū)動怪物的范圍的消息(Player Dirver Rect) 的傳遞流程圖 具體實(shí)施方式
實(shí)施例1
如圖1所示, 一種利用事件驅(qū)動網(wǎng)絡(luò)游戲服務(wù)器的實(shí)現(xiàn)方法,通過事件驅(qū)動 服務(wù)器根據(jù)事件源將事件分為三種類型,事件驅(qū)動服務(wù)器包括每種事件類型對應(yīng) 的獨(dú)立處理器;當(dāng)事件源的消息來到游戲'服務(wù)器時,事件驅(qū)動服務(wù)器中的事件產(chǎn) 生器就對到來的消息進(jìn)行封裝處理并產(chǎn)生一個事件,然后由事件驅(qū)動服務(wù)器中的 事件分配器將產(chǎn)生的事件分配給相應(yīng)的處理器進(jìn)行處理。
所述事件源包括IOCP層的Player Event,即來自客戶端玩家網(wǎng)絡(luò)消息觸發(fā) 的該玩家的事件;Script Manger產(chǎn)生的事件,即服務(wù)器腳本產(chǎn)生的事件,比如服 務(wù)器定時要發(fā)生的事件, 一些在游戲地圖中游走的非玩家控制角色等;收到各個 事件處理器產(chǎn)生的事件。
采用I0CP的網(wǎng)絡(luò)層,用于接收客戶端發(fā)來的消息;Script Manger,服務(wù)器
的腳本管理,用于根據(jù)腳本產(chǎn)生的服務(wù)器事件。
所述根據(jù)事件源將事件分為三種類型PLAYER_EVENT,玩家相關(guān)的事件 MAP—EVENT,地圖相關(guān)的事件;GS一EVENT,服務(wù)器事件。
所述三種類型事件對應(yīng)的處理器為PLAYER—EVENT對應(yīng)的Player Event Processor,玩家事件處理器;MAP—EVENT對應(yīng)的M鄰Manger,地圖管理器;GS—EVENT 對應(yīng)的GS Event Processor,全局事件處理器。
所述事件和對應(yīng)的處理器也可以根據(jù)實(shí)際情況所需進(jìn)行擴(kuò)充。
IOCP層的消息只會觸發(fā)PLAYER—EVENT事件,這種類型的事件用于通知服務(wù)器 該玩家網(wǎng)絡(luò)層有消息,由Player Event Processor模塊去取出玩家的消息進(jìn)行處 理;Script Manger模塊觸發(fā)GS_EVENT事件,由GS Event Processor處理服務(wù)器 本身觸發(fā)的一些全局性的事件,比如廣播等等;Map Manger用于管理地圖列表, 并處理地圖中的怪物、非玩家控制的角色、掉在地上的物品等對象。
所述事件產(chǎn)生器和事件分配器接受從IOCP、 Script Manger及各事件處理器 產(chǎn)生的事件,負(fù)責(zé)事件的產(chǎn)生和分配。
所述Player Event Processor, Map Manger禾口 GS Event Processor3個事 件處理器也會產(chǎn)生PLAYER_EVENT, MAP一EVENT和GS—EVENT這3種類型的事件。
所述Player Event Processor, Map Manger禾口 GS Event Processor3個事 件處理器中再次產(chǎn)生了事件,這個事件將被發(fā)送到事件產(chǎn)生器進(jìn)行封裝,然后又通 過事件分配器進(jìn)行分配,最后仍然通過各個事件處理器進(jìn)行處理,如此往復(fù)。
所述事件產(chǎn)生器和事件分配器或者Player Event Processor, Map Manger
和GS Event Processor3個事件處理器中的任意一個模塊都采用被動方式工作, 只有消息或事件到來事件產(chǎn)生器才產(chǎn)生對應(yīng)事件,當(dāng)有事件到來分配器才進(jìn)行分 配,同樣每個事件處理器也只有事件到來才進(jìn)行處理。 實(shí)施例2
一種利用事件驅(qū)動網(wǎng)絡(luò)游戲服務(wù)器的實(shí)現(xiàn)方法,設(shè)置有Player Event Processor^
每個玩家將劃分單獨(dú)的消息緩沖區(qū),如果一個玩家消息異常,僅僅只是影響自 己的消息處理。IOCP網(wǎng)絡(luò)層的消息到達(dá)事件產(chǎn)生器時,事件產(chǎn)生器將做合法性檢 測(如收到消息的頻率過高等為非法),然后進(jìn)行封裝并將該消息并放(Push)到 玩家對應(yīng)的消息緩沖區(qū)中。成功,則產(chǎn)生一個事件(僅僅包含該事件的類型及指
向該玩家的指針),放(Push)到服務(wù)器的事件列表中。當(dāng)通過事件分配器的接收 到事件根據(jù)事件的類型來進(jìn)行事件的分配處理,到達(dá)Player Event Processor的
時候,將通過事件中的指向該玩家的指針去相應(yīng)的消息緩沖區(qū)中獲取消息并處理。 實(shí)施例3
一種利用事件驅(qū)動網(wǎng)絡(luò)游戲服務(wù)器的實(shí)現(xiàn)方法,Player消息驅(qū)動Map: Map Manger中保存有兩種類型的地圖列表。 一個為有玩家存在的列表,標(biāo)識 為Map—A; —個為沒有玩家存在的列表,,標(biāo)識為Map_B。只有Map—A需要做地 圖事件的及時輪詢,如有需要Map一B只需要間隔性的輪詢就可以了 (比如處理掉 落的在地面的物品),這個可根據(jù)實(shí)際情況處理。當(dāng)一個玩家進(jìn)入一張空地圖,將 產(chǎn)生一個事件,這個事件將有限度的驅(qū)動這張地圖。即從Map一B列表添加到M即一A 列表。從游戲的生命期來講,每款游戲都將大致經(jīng)歷游戲初期(是大多數(shù)玩家 等級較低)、游戲中期(大多數(shù)玩家等級處于中間階層)、游戲成熟期(大多數(shù)玩 家等級比較高)、游戲末期(玩家人數(shù)相對回落)。在游戲的每個階段,而處于其他 階段的地圖上沒有玩家或很少,根據(jù)這一特點(diǎn),采用事件驅(qū)動的服務(wù)器做法這樣劃 分地圖是非常有必要的。所謂"有限度"是指玩家觸發(fā)了這張地圖的哪些事件, Map Manger才處理相應(yīng)事件,也就是說服務(wù)器只做必要的事情。比如 一個玩家 進(jìn)入某張戰(zhàn)斗地圖,那他只能看見他視距范圍內(nèi)的某些怪物或非玩家控制角色,只 需要處理這些怪物和非玩家控制角色即可,因?yàn)閷τ谝粡垜?zhàn)斗地圖來說,這些大量 的怪物或非玩家控制的角色的人工智能將耗費(fèi)可觀的資源。同時,讓虛擬世界更 加接近真實(shí)世界。此外,每款游戲都有相當(dāng)數(shù)量的特殊地圖,比如競技場、戰(zhàn)斗地 圖、活動地圖等等,而這些特定的地圖往往是在特定時段開放較為短暫時間。按照 事件驅(qū)動原理,也只在相應(yīng)時段才處理這些特殊地圖上的事件,從而達(dá)到只做有 用功的目的。
當(dāng)處理一個玩家傳送到新的地圖時,如果發(fā)現(xiàn)新地圖中沒有人,則產(chǎn)生一個 添加到有玩家存在地圖列表的消息,并將該消息通過事件產(chǎn)生器放到Map Manger 的消息緩沖區(qū)中,同時生成一個事件,該事件通過事件分配器然后到Map Manger 最后處理。 實(shí)施例4
一種利用事件驅(qū)動網(wǎng)絡(luò)游戲服務(wù)器的實(shí)現(xiàn)方法,設(shè)置有Player驅(qū)動怪物,如 圖2所示
A: Player的最大可能視野 B: Player能驅(qū)動的怪物的范圍。 C:整個地圖區(qū)域。 正方形B的寬,為A半徑的4倍。
一般的怪物,只是在有玩家存在是才會有動作發(fā)生,其他情況該怪物為靜止 狀態(tài)。這使得玩家驅(qū)動怪物變得可行。
根據(jù)視距驅(qū)動地圖在處理玩家的走路,轉(zhuǎn)換等消息時,生成該玩家的驅(qū)動
怪物的范圍B,并與當(dāng)前地圖中的其他玩家驅(qū)動的范圍做合并的運(yùn)算,當(dāng)玩家行走
到A的范圍外時,更新玩家的驅(qū)動怪物的范圍B。
實(shí)施例5
玩家驅(qū)動怪物的范圍的消息(Player Dirver Rect)的傳遞流程如圖3所示。 此外按照事件驅(qū)動原理,在玩家事件的處理上也有很多可以剔除的無用功.作 為一個玩家,我們往往有這樣的經(jīng)歷,進(jìn)入游戲世界后,人暫時離開,免費(fèi)模式大行 其道的今天,這種現(xiàn)象更甚。通常的做法是,服務(wù)器仍然不停處理暫時離開玩家的 事件。比如該玩家周圍的信息(包括鄰近玩家、非玩家控制角色、怪物等等);再 如各種聊天頻道的信息等等。在事件驅(qū)動的服務(wù)器中采用一定規(guī)則避免這樣的資 源浪費(fèi)現(xiàn)象.如果玩家停留在原地,僅僅觸發(fā)了非常少量的事件,那它也只能接收 到較少量的信息,從而減輕服務(wù)器壓力.按以上原則如玩家停留在原地不動到達(dá)規(guī) 定時間以上,我們將他劃入休眠狀態(tài)序列,只接受一些基本數(shù)據(jù),而周圍玩家或怪 的信息將不被發(fā)送等等.從而達(dá)到節(jié)省資源的目的。
權(quán)利要求
1、 一種利用事件驅(qū)動網(wǎng)絡(luò)游戲服務(wù)器的實(shí)現(xiàn)方法,其特征在于通過事件驅(qū) 動服務(wù)器根據(jù)事件源將事件分為三種類型,事件驅(qū)動服務(wù)器包括每種事件類型對 應(yīng)的獨(dú)立處理器;當(dāng)事件源的消息來到游戲服務(wù)器時,事件驅(qū)動服務(wù)器中的事件 產(chǎn)生器就對到來的消息進(jìn)行封裝處理并產(chǎn)生一個事件,然后由事件驅(qū)動服務(wù)器中 的事件分配器將產(chǎn)生的事件分配給相應(yīng)的處理器進(jìn)行處理。
2、 根據(jù)權(quán)利要求l所述的一種利用事件驅(qū)動網(wǎng)絡(luò)游戲服務(wù)器的實(shí)現(xiàn)方法,其特征在于所述事件源包括IOCP層的Player Event,即來自客戶端玩家網(wǎng)絡(luò)消 息觸發(fā)的該玩家的事件;Script Manger產(chǎn)生的事件,即服務(wù)器腳本產(chǎn)生的事件, 比如服務(wù)器定時要發(fā)生的事件, 一些在游戲地圖中游走的非玩家控制角色等;收 到各個事件處理器產(chǎn)生的事件。
3、 根據(jù)權(quán)利要求l所述的一種利用事件驅(qū)動網(wǎng)絡(luò)游戲服務(wù)器的實(shí)現(xiàn)方法,其 特征在于所述根據(jù)事件源將事件分為三種類型PLAYER—EVENT,玩家相關(guān)的事 件;MAP—EVENT,地圖相關(guān)的事件;GS—EVENT,服務(wù)器事件。
4、 根據(jù)權(quán)利要求3所述的一種利用事件驅(qū)動網(wǎng)絡(luò)游戲服務(wù)器的實(shí)現(xiàn)方法,其 特征在于所述三種類型事件對應(yīng)的處理器為PLAYER—EVENT對應(yīng)的Player Event Processor,玩家事件處理器;MAP—EVENT對應(yīng)的Map Manger,地圖管理器;GS—EVENT 對應(yīng)的GS Event Processor,全局事件處理器。
5、 根據(jù)權(quán)利要求l所述的一種利用事件驅(qū)動網(wǎng)絡(luò)游戲服務(wù)器的實(shí)現(xiàn)方法,其 特征在于所述事件產(chǎn)生器和事件分配器接受從IOCP、 Script Manger及各事件 處理器產(chǎn)生的事件,負(fù)責(zé)事件的產(chǎn)生和分配。
6、 根據(jù)權(quán)利要求4所述的一種利用事件驅(qū)動網(wǎng)絡(luò)游戲服務(wù)器的實(shí)現(xiàn)方法,其 特征在于所述Player Event Processor, Map Manger禾口 GS Event Processor3 個事件處理器也會產(chǎn)生PLAYER—EVENT, MAP—EVENT和GS—EVENT這3種類型的事 件。
7、 根據(jù)權(quán)利要求4所述的一種利用事件驅(qū)動網(wǎng)絡(luò)游戲服務(wù)器的實(shí)現(xiàn)方法,其 特征在于所述Player Event Processor, M鄰Manger禾口 GS Event Processor3 個事件處理器中再次產(chǎn)生了事件,這個事件將被發(fā)送到事件產(chǎn)生器進(jìn)行封裝,然后 又通過事件分配器進(jìn)行分配,最后仍然通過各個事件處理器進(jìn)行處理,如此往復(fù)。
8、根據(jù)權(quán)利要求l所述的一種利用事件驅(qū)動網(wǎng)絡(luò)游戲服務(wù)器的實(shí)現(xiàn)方法,其 特征在于所述事件產(chǎn)生器和事件分配器或者Player Event Processor, Map Manger和GS Event Processor3個事件處理器中的任意一個模塊都采用被動方式 工作,只有消息或事件到來事件產(chǎn)生器才產(chǎn)生對應(yīng)事件,當(dāng)有事件到來分配器才 進(jìn)行分配,同樣每個事件處理器也只有事件到來才進(jìn)行處理。
全文摘要
一種利用事件驅(qū)動網(wǎng)絡(luò)游戲服務(wù)器的實(shí)現(xiàn)方法,其特征在于通過事件驅(qū)動服務(wù)器根據(jù)事件源將事件分為三種類型,事件驅(qū)動服務(wù)器包括每種事件類型對應(yīng)的獨(dú)立處理器;當(dāng)事件源的消息來到游戲服務(wù)器時,事件驅(qū)動服務(wù)器中的事件產(chǎn)生器就對到來的消息進(jìn)行封裝處理并產(chǎn)生一個事件,然后由事件驅(qū)動服務(wù)器中的事件分配器將產(chǎn)生的事件分配給相應(yīng)的處理器進(jìn)行處理;本發(fā)明的事件驅(qū)動的服務(wù)器只處理已經(jīng)觸發(fā)的事件,達(dá)到避免做大量無用功的目的,可以大量節(jié)約服務(wù)器資源,減小服務(wù)器承載量,提高了服務(wù)器效率,擴(kuò)大游戲世界,減少運(yùn)營成本。
文檔編號G06F19/00GK101122867SQ20071005007
公開日2008年2月13日 申請日期2007年9月20日 優(yōu)先權(quán)日2007年9月20日
發(fā)明者任春紅, 閆文正 申請人:成都金山互動娛樂科技有限公司