说一说地图AOI 服务器实现(九宫格)

在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();//玩家进入场景格子(出生、在地图上初始化-进入场景) 通知格子周围玩
  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值