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