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