场景管理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 解决玩家走动会忽然消息不见的问题 只要其他玩家没有走出视野 就不会被卸载

posted on 2014-10-24 15:22  kangbry  阅读(471)  评论(0编辑  收藏  举报

导航