AOI算法簡介
定義: 獲取感興趣的區域(Area Of Interest)的算法。
解決的問題: 形成周圍的概念。在多人游戲中,各個游戲客戶端之間需要通過服務器向彼此更新自身狀態。但對於當玩家來說,我們不需要獲取“太遠”的玩家的信息,所以,在服務器端,我們通過AOI算法可以獲取到某個客戶端“周圍”的玩家,進而只在該小范圍內同步信息。
網格法AOI:
- 參考游戲世界的坐標,創建一個邊界相同的矩形。
- 選取適當的顆粒度,將矩形分割成幾×幾的網格。
- 每個客戶端都要按照實際坐標添加到某個格子里。
- 客戶端所在格子的周圍八個格子內的玩家就是周圍玩家。
舉例: 世界坐標是X[20,200],Y[50,230],划分成6×6的網格為:
- 已知玩家坐標(x,y),該玩家在幾號網格?
網格編號=(x-x軸起始坐標)/x軸網格寬度 + (y-y軸起始坐標)/y軸寬度*x軸網格數量 x軸網格寬度=(x軸結束坐標-x軸起始坐標)/x軸網格數量;y軸的計算方式相同
- 已知玩家在n號網格,周圍的格子(包括自己)有哪些?
AOI算法實現
- 面向接口編程,定義AOI_Player類用於表示網格內的玩家,提供純虛函數獲取玩家坐標
- 網格類用於存放網格內的玩家:封裝一個list用於添加和刪除玩家
- 世界地圖類用於構造和表示所有網格
- 屬性:x和y軸的起始結束坐標,x和y軸的網格數
- 網格表示:封裝一個vector存放所有的網格對象,網格序號按照vector存儲序號表示
- 主要函數:根據坐標獲取網格,根據網格號獲取周圍網格