分佈式AOI處理

首先簡要介紹下AOI的基本概念.算法

AOI的意思是area of interest,也就是關注區域.那麼什麼是關注區域.在遊戲中,你能看到視野內其它對象的位置變化,各類各樣的行爲變化.NPC對象能根據本身附近的對象選擇合適的AI行爲.這裏的視野和附近區域,就是一個對象的關注區域.服務器

關注區域內的其它對象狀態發生變化時,應該通知關注者.而關注區域由關注者自身所處的位置以及關注半徑決定的.網絡

當一個對象從關注者的關注半徑外移動到半徑內,則須要向關注列表中添加一個新的關注對象.反之則須要從關注列表內刪除一個對象.多線程

AOI在大型網絡遊戲中是容易成爲瓶頸的部分.假如遊戲內發生大型的熱點事件,例如國戰.則在某一個區域內將彙集大量的玩家.例如出生點或跳轉點附近.所以若是能夠將AOI處理分攤到多個進程中,將能夠有效的提升遊戲服務器處理熱點事件的能力.負載均衡

本文不打算詳細介紹AOI處理相關的算法.想了解的朋友能夠搜索九宮格或十字鏈表.性能

下面將進入本文的正題.線程

首先假設咱們有一片大區域,在這片區域內的對象均可能產生交互.所以這片區域造成一塊統一的AOI管理區域.進入這片區域的對象都要受到管理.rest

能夠將這片區域分佈到N個進程上.全部受管理的對象在這N個進程中都存在副本.這些副本對象被分紅兩類:master對象或ghost對象.master對象只能存在於一個進程中,其它進程中必然是ghost對象.對象

遊戲對象發生位置變動時,將變動同步給全部的AOI對象.對於ghost對象只是簡單的更新當前位置.只有master對象纔會有進一步的處理.隊列

AOI服務以固定的頻率處理master對象.每當一個進程收到master對象變動時,就將對象添加到變動列表中,直到到達處理週期纔會對變動列表中的對象進行處理.

經過將master對象均勻的分佈到多個進程中,使得一片AOI區域可以處理更大的對象數量.

在極端狀況下,可能會出現某個進程上彙集大量活躍且互相關注AOI對象的狀況.這個時候就須要將經過負載均衡機制,將一部分master對象移動到負載相對較輕的進程中.由於全部進程上的AOI對象實際上都保存了遊戲對象的副本信息(位置,是否隱身等).這個遷移過程只涉及到master標記的切換.

實現問題:

  • 遊戲對象位置變動須要通知給N個AOI進程.固然由於須要通知的數據只涉及到座標信息,數據量不大應該不會成爲太大的問題.固然也能夠考慮多線程,主從進程模式.這樣變動消息只要通告到兩個進程便可.

  • 只有master對象能夠嚮應用通告AOI變化事件.考慮以下場景,有A,B兩個對象,其master對象分別在兩個AOI進程a,b中.假設a進程在的對象是masterA,ghostB,b進程中是masterB,ghostA.最開始的時候A,B都在對方的可視半徑外.而後分別向一箇中間點靠近.在某一時刻t,他們將會進入對方視野.若是讓master和ghost對象均可以通告AOI事件.則對同一個進入視野的事件將會嚮應用進程通告兩次.一次是由ghost對象觸發,例如處理masterA的時候,觸發A進入ghostB,另外一個則是處理masterB時觸發的A進入masterB.雖然說應用進程能夠處理這種重複事件,但重複事件太多畢竟會影響程序和網絡性能.另外一方面若是隻有master對象能夠觸發AOI事件則會產生另一個問題.若是一個master對象是靜止的,那麼它將收不到任何AOI事件.解決辦法是對於靜止對象或微動對象,可使用一個更大的時間間隔來將其添加處處理隊列中,保證其能夠觸發AOI事件.

  • 須要對AOI進程進行健康度檢查,若是其中某些進程出現故障或負載太高,能夠將其中的master對象遷移到健康的進程上.

  • 如何遷移master對象?當一個進程負載太高時,應該被遷移的是那些熱點對象,也就是處於對象最密集區域中的那些對象.能夠爲每一個master對象記錄一個計數值,這個值是一個master對象被處理時掃描過的對象數量.根據這個計數值將master對象放在一個大根堆中,當須要遷移時只須要從這個大根堆中提取對象便可.

  • 若是是由於進程出現故障須要遷移如何處理?應用進程中的每一個對象記錄本身的master對象在哪一個AOI進程上,當接到AOI進程故障的通告時將這些對象的master對象分配到其它健康的AOI進程中.

相關文章
相關標籤/搜索