服务器AOI



      这两天优化了一下一个Java页游服务器的AOI。其实这个优化纯属迫不得已,因为项目已经很久了,当时很多怪物还都是暗雷!!玩家在杀任务怪的时候,需要去地图里面乱转以碰见怪物。

      根据策划的要求,将怪物刷成明怪。就是要玩家看到,当然怪物不一定要动。,只是作为一个影像。既然是优化,那我就彻底优化一下喽;之前的广播是这样子做的,一个玩家的状态更新(比如说坐标更新,头衔更新,等)都是全场景广播,其他客户端根据接收到的广播验证坐标,再判断是不是需要处理这条消息!这样就造成了很大的浪费!这次我使用格子的思想进行优化!(或者说九宫格吧)

      这里有一个前提--可见关系----如果我能看到你,那么你也能看到我。根据游戏设计格子的大小,大概从30-60不等,可以调整;每个玩家在场景内即可看到周围九个格子的信息,包括里面的怪物和宠物。玩家自己状态的更新,要告知周围的玩家;而周围九个格子内的怪物或者玩家的状态更新,也要广播给这个玩家。这里还是要区分怪物和玩家,因为怪物对玩家可见,而玩家并不对怪物可见。为每个玩家每个怪物维护一个可见列表,即在自己的状态更新的时候,要将自己最新的状态告知这个列表上的玩家! 同时场景要记录每个格子上面的怪物和玩家,还可以添加npc或者宠物列表!


基本流程:

      1:游戏服务器启动时候,要添加怪物到对应的格子中。

      2: 玩家登入时候,要获取周围九个格子的信息,并将自己,添加到格子中怪物和玩家的可见列表。同时将格子中的玩家,添加到自己的可见列表中。

      3:玩家走动时候,如果从一个格子走到了另一个格子,就要计算那些格子由可见变为不可见,并且解除与这些格子中怪物和玩家的可见关系。还要计算那些格子由不可见变为可见,那么就要和这些格子中的玩家建立可见关系。在上图做一个简单的展示,比如说玩家从红色小屋的位置走到橙色小屋的位置,那么紫色区域由可见变为不可见,而黄色区域由不可见变为可见。那么就要接触和橙色区域玩家的可见关系,而要和黄色区域的玩家建立可见关系!

      4:玩家登出时候,解除和周围九个格子中的玩家和怪物的可见关系!

注意事项:

      1:在计算格子由可见变为不可见或者由不可见变为可见,一定要注意边界关系

      2:由于我们的服务器是用线程池处理的,所以在维护场景格子怪物列表,格子玩家列表时候,一定要注意同步问题!

      3:怪物维护自己的可见列表,还可以做成主动怪物!!主动攻击玩家!

      欢迎探讨!!!


-----------------------------------------------------华丽的分割线-----------------------------------------------------------------
以下是另外一篇:
刚巧这两天调整aoi就随便说说,
 因为aoi是一个中间功能层“空间管理”的一个子功能,
 具体如何实现依赖到底层是如何实现的,
aoi也体现了游戏的空间观,
 像mudos,cs等就简单的使用房间的概念,
 在有限的空间里遍历所有对象。
 那样aoi就不单控制可见对象,
 其实也就等同于空间的分配管理。
 对于非房间类的网络游戏分两种方案,
 大格子和小格子,所谓格子就是把空间划分为等距矩阵。
 大格子就是矩阵的孔比较大,可以放入多个玩家,
 小格子是孔比较小一般只放一个玩家,
 小格子的代表是传奇,一个玩家占一个格子,可以把其他玩家挤出去。
 大格子像是魔兽,玩家不占地盘可以重叠。
 小格子的算法很容易理解,根据坐标遍历周围的格子找到一定范围的玩家。
 大格子也差不多,遍历周围的格子找到玩家。
 说到这各位看官可能恍然大悟,所谓aoi就是对"空间-玩家"的索引。
 所要解决的问题是像玩家的可见对象?指定给定坐标范围的可见对象等等。
 不画格子把所有玩家循环一遍不就知道了吗?
 因为aoi使用非常频繁,每次循环几百,几千人实在吃不消。
 举例来说,玩家移动后,要把同步信息更新到周围的玩家,
 就要知道周围有哪些玩家,并把位置同步信息更新过去。
 如果每次都先判断周围有哪些玩家这要循环一堆人,
 然后再发生同步信息,可想而知工作量有多大,
 例如跳起,就可能分为3个封包,升,落,停,都涉及位置移动和同步广播。
 几乎1秒钟内一个跳起的动作就要3次的区域广播。
 而几乎同样的时间,玩家可能在区域进入,离开。
 区域内的玩家数量还是在不断的变化中。
 虽然只是空间管理的子功能但却是对速度要求最高的部分,
aoi不单涉及到位置同步,还比如npc的攻击事件,玩家聊天,各种动作同步等等的上层功能。
 更新aoi过程中还涉及到玩家对象的和其他对象在客户端的是否可见。
 如果是动态的创建npc而不是在创建地图的时候创建npc,
 aoi还担负着触发npc创建和删除的工作。
 因为牵扯的东西太多,对效率要求也太高,我不觉得单独放到一个服上是好主意。
 网络通信的压包,解包,即使是内网也很难接受。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值