再谈网络游戏同步

呵呵,一年前的这个时候发过一系列讨论网络游戏同步的帖子。
一年后的今天,再重新讨论讨论这个问题。。。

不知道大家是否碰到过这种情况,当某个玩家发出一个火球,这个火球有自己的运动
轨迹,那么如何来判断火球是否打中了人呢?大部分情况,当策划提出这个要求的时
候,一般会被程序否认,原因是:太麻烦了,呵呵。复杂点的还有包括两个火球相撞
之类的事情发生。

那么网络游戏中,是否真的无法模拟实现这种模拟呢?

首先我们来看看模拟此种操作会带来什么样的麻烦:
1,服务器必须trace火球的运行轨迹,乍一想,挺慢的。
2,网络延迟,传过来有延迟,传过去有延迟,延迟还不稳定,麻烦。
3,都有两点解决不了了,接下来不愿意再想了。

呵呵,实际上呢,对火球的模拟比对人物运动的模拟要轻松很多,原因很简单,火球
的方向不会变。下面来看看具体用什么样的结构来实现:

不知道大家是否还记得我去年这个时候提到过的Dead Reckoning算法,我们要模拟火
球运动的关键就在于一个叫Moving Objects Tracing Server的服务器程序,这个服务
器是干什么的呢。这个服务器接收主游戏服务器发过来的注册事件的信息,比如有个
玩家,开始移动了,那么主游戏服务器就把该玩家的运动PDU,包括方向,速度,加速
度,起点发给MOTS (Moving Objects Tracing Server),然后MOTS自己开始对其运行
进行模拟,当游戏服务器发来第二个PDU包的时候,则对各个物件的位置进行修正,并
重新开始模拟。那么,我们模拟的目的是什么呢?当然是发生某些事件,比如说碰撞,
或者掉入地图的某个陷阱的时候,会将该事件回发给主逻辑服务器。然后逻辑服务器来
处理该事件。

那么,对于火球的处理,也和处理其他玩家的同步一样,当接收到玩家的发火球的指令
以后,产生一个火球,并指定其PDU信息,在MOTS上注册该个运动物体。当MOTS自行模
拟到这个物体和其他玩家或者NPC物体产生碰撞,则通知主逻辑服务器,然后主逻辑服
务器产生相应的动作。

那么关于延迟呢?有些人也许会说,比如说前面有个火球,我本地操纵的小人其实躲过
去了,但是因为网络延迟,在服务器上我并没有躲过去,那么怎么算?呵呵,不知道大
家玩过星际没有,有没有发现在星际中玩多人连线模式的时候,有一点最特别的地方,
就是控制一个小兵的时候,点了地图上的某个位置,但是小兵并不会马上开始移动,而
是有一定的延迟,但是这一小点延迟并不能掩盖星际的经典,同样的理论用到这里也成
立。对于客户端的控制,当玩家操纵的主角改变PDU信息的时候,确保信息发送到服务
器之后,再开始处理本地的操作指令,这样就能保证本地的预测和服务器的预测几乎是
没有什么误差的,即使有很小的误差产生,以服务器为主,这样玩家也不会有太大的抱
怨。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值