在mmo游戏中,玩家在地图上移动,如果发消息通知地图上其他玩家肯定是不合理的,因为一个地图上有很多人,如果都在移动,那么消息量会很大。为此服务器为了减少发包量,会将地图划分成一个一个的格子,然后通知相邻格子的玩家,而不是全地图的人。通常这种技术叫做AOI。
通常的实现方式:
1、服务器加载场景地图会将场景按照固定大小格子进行划分,并做好编号,
2、通常有三个操作
EnterZone、LeaveZone、ChangeZone
下面是伪代码:
class Zone
{
public:
Zone();
~Zone();
//获取格子四个角
float YMax();
float XMax();
float YMin();
float XMin();
private:
Vector3 m_centor; //地图(x,y,z) 格子中心点
int32_t m_nZoneSize{0}; //方格大小
std::set<Player *> m_pPlayerSet; //格子内玩家
int32_t m_nZoneId{0}; //格子编号
};
//一个场景格子管理器
class ZoneManager{
typedef std::set<Player *> players_type;
typedef std::vector<ZoneId> zone_ids_type;
public:
bool Init(float fMapX, float fMapY, int nZoneSize); //将地图划分成格子
bool EnterZone();//玩家进入场景格子(出生、在地图上初始化-进入场景) 通知格子周围玩