场景管理aoi
enter事件
1. 离开旧场景
2. 进入新场景
3 move事件
4 on_enter
leave事件
1 uid --> old_cell
2 leavel_cell on_leave 广播离开事件
move事件
1 uid --> old_cell
2 pos --> new_cell
3 a. 存在old_cell && old_cell != new_cell 先离开old_cell(广播离开事件)
b. 进入new_cell(广播进入事件)
c. onmove事件广播
cell数据结构
uid2cell uid-->cell
cid2cell cellid-->cell
{
[1] = {
users = {} //玩家坐标
count = 0; //格子内玩家个数
id = cell_id; //格子id
}
map = {
[cell_id] = cell[1] //记录周边格子的信息 key cell_id v = cell[1]
}
}
enter_cell逻辑
1 cell_id --> cell
2 cell不存在
a. 创建新cell
b. 将本格子信息插入到周边格子
c. 将周边格子插入到本格子(相同层)
3 进入格子处理
a. 判断cell[1].users[uid] 新进入cell[1].count + 1
b. cell[1].users[uid]的坐标
c. 更新uid2cell = cell_id
leave_cell逻辑
1 cell_id --> cell
2 cell[1].users[uid]=nil
3 cell[1].count - 1
4 更新uid2cell[uid] = nil
onener
1 广播新分组玩家自己的信息
2 通知自己进入的新分组玩家信息
onleave
1 通知旧的分组玩家自己离开
onmove
1 from_cell == to_cell 分组内移动,广播移动消息
2 from_cell != to_cell 分组改变
a.在原视野不在新视野 广播离开
b.在新视野且不在旧视野 广播进入
c.在新视野且在旧视野 广播移动
d.a,b两种情况 通知自己其他玩家离开自己视野
优化
1 格子依旧记录不饱和玩家信息
2 玩家身上挂载附近格子的玩家(最大MAX个,饱和状态)
3 玩家所在格子变动 去掉不在当前视野旧格子范围内的玩家,然后挂载在当前视野新格子的不饱和玩家
4 解决玩家走动会忽然消息不见的问题 只要其他玩家没有走出视野 就不会被卸载