mmorpg无缝地图

         接了个mmorpg无缝地图项目。基于一个已经成型的mmorpg自研服务器框架,多个地图分布在不同的进程里,业务互相独立。
        本来打算统一客户端服务端使用同一套地图块加载方案的,不过客户端另做处理了,反正两者不是必须一致,于是服务端我采用了九宫格地图的方式。
        服务端无缝地图,就是按照不同进程管理不同的格子地图块,邻接地图的边缘做跨进程镜像系统,跨边界移动时做数据跨进程数据迁移来实现。
        为了减少复杂度,优先考虑在地图块边沿区域不让怪物进入的设计,当然,这个机制可以扩展为兼容怪物跨地图移动,但时间有限,而且向后兼容,就先(必须)做了玩家(坐骑、宠物)跨地图移动机制。
        无缝地图的复杂点和难点应该就是镜像这里,实现流程,首先要在邻接地图的进程里,做一个本地图进程上的角色的镜像(影子),能把角色的模型,装备,动作等基本表现呈现出来。就是每个地图服务器的地图里,比如九宫格的某个格子地图(进程)A上,当某玩家甲移动到了边缘区域a,那么,对于邻接地图(进程)B,在其边缘区域b里,应该能看到a里面的甲了。虽然地理上甲还是在A里面,但由于进入视野,所以需要在b里面生成甲的镜像乙。
        由于mmorpg,尤其是所谓状态同步的设计,客户端上出现的角色信息,比如使用什么模型,穿什么装备,移动到什么坐标,都是服务端“实时”通知给客户端的。所以要做镜像的视觉呈现,只需要往B里也发送相同的一份相关信息就基本上可以了。
        但是到了这一步,镜像还只是纯影子,还没有互动能力。
        那么第二步,就要做镜像的互动功能了。
        要传递攻击。因为在b里面的乙,如果玩家丙能和乙互动,那么可知,丙也有镜像丁出现在a里面(因为战斗等互动的范围,必须小于可视范围),如果是玩家甲攻击玩家丙,那么在进程范畴里,则是玩家甲攻击镜像丁,或者说镜像乙攻击玩家丙。那么是把丁接受的攻击传递给丙,还是把甲的攻击行为传递给镜像乙呢,可以选其中一个。
        然后交易,加好友等其他互动,也可以按照类似的方法跨进程传递。
        我的做法是使用操作系统的跨进程共享内存来实现数据传递。
        
        接下来,就是处理跨地图移动的问题了,我在这里费了点功夫。
        因为跨地图移动,需要进行多进程同步。至少有A B两个地图服务器参与,还加上一个枢纽服务器,那么通信同步,数据库同步。就需要花点功夫来处理了。
        首先必须对原服务器的逻辑流程有充分的了解,然后要做到出入地图的数据库操作原子化串行化。当然,要理清进出服务器的业务流程。        
        因为还要涉及多线程同步,所以这里确实会花一些精力。
        最后,由于跨地图移动,对于客户端来说,现在是一个镜像的消失紧接着一个玩家的创建的过程,由于客户端的位移与服务端一般会有一个插值同步问题,所以会出现一个瞬移现象。那么需要给一些信息给客户端,把这个瞬移处理掉。
        搞了半年,其中还做了2d A*寻路到recast&detour 3d寻路的迁移,还有飞行功能,家族功能,技能系统等内容,目前无缝地图只是是理论完成+初步测试。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值