MMORPG手遊AOI解決方案
接下來打算做一個國戰類的MMO手遊,國戰類手遊首相要解決的就是多人同屏AOI問題。稍微看了一下主流的解決方案,做個簡單的記錄。
目前最常見的是有兩種解決方案,九宮格和十字連結串列。
一 九宮格
主要思路是講場景地圖分成多個格子,每個格子記錄其周圍的格子資訊。
1 進入
角色進入場景,根據其座標,將其置於一個格子之中;
然後向角色所在格子及其周圍格子中的所有玩家傳送add訊息。
2 移動
設玩家移動之前的九宮格集合為old_set,移動之後的集合為new_set,則
向(old_set - new_set)集合中玩家傳送leave訊息;
向(new_set - old_set)集合中玩家傳送add訊息;
向(old_set & old_set)集合中玩家傳送move訊息;
3 離開
角色離開場景,向角色所在格子及其周圍格子中的所有玩家傳送leave訊息。
缺點,因為是用格子定的是否向其傳送訊息,不可見的一些角色也會被髮送,會有訊息冗餘,浪費寬頻。
二 十字連結串列
首相,根據場景中所有角色的x座標排序,將其放入一個連結串列x_list中;
然後,根據場景中所有角色的y座標排序,將其放入一個連結串列y_list中。
這樣,所有的角色同時位於兩個連結串列中。
1 進入
玩家進入時,根據x、y座標排序,分別插入到x_list,y_list中。
同時,根據可視距離,得到x_list中可視的角色集合x_set,y_set中可視的角色集合y_list,
那麼(x_set & y_set)就是真正可視的角色集合,向其傳送add訊息
2 移動
根據角色之前的位置可以得到old_set;
移動之後,需要根據新的x、y座標,重新找到角色在x_list,y_list中的位置,
然後的到新的可見角色集合為new_set,則
向(old_set - new_set)集合中玩家傳送leave訊息;
向(new_set - old_set)集合中玩家傳送add訊息;
向(old_set & old_set)集合中玩家傳送move訊息;
3 離開
向當前真正可視的角色傳送levea訊息,然後從x_list和y_list中刪除即可。
缺點,每次移動需要重新更新角色在連結串列中的位置,浪費CPU
一般的遊戲都採用的九宮格的方式來處理AOI訊息。