1 / 12
文档名称:

网游同步解决方案.doc

格式:doc   大小:69KB   页数:12页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

网游同步解决方案.doc

上传人:xxj16588 2016/8/16 文件大小:69 KB

下载得到文件列表

网游同步解决方案.doc

相关文档

文档介绍

文档介绍:网游同步解决方案因为最近在研究一个东西, 里面有一个难题, 就是同步的问题, 一直在网上查资料, 总算找到几篇感觉不错的。把网络游戏里面的同步问题解释的很清楚~所以贴出来大家讨论讨论。不过我要的还不是这种同步, 现在稍微有一点眉目了。要抽个时间静下来好好想想。就罗唆这么多了~ ----------------------------------------------------------- ----------------------------------------------------------- --------- 不知道大家是否碰到过这种情况,当某个玩家发出一个火球,这个火球有自己的运动轨迹, 那么如何来判断火球是否打中了人呢?大部分情况, 当策划提出这个要求的时候, 一般会被程序否认, 原因是: 太麻烦了,呵呵。复杂点的还有包括两个火球相撞之类的事情发生。那么网络游戏中,是否真的无法模拟实现这种模拟呢? 首先我们来看看模拟此种操作会带来什么样的麻烦: 1 ,服务器必须 trace 火球的运行轨迹,乍一想,挺慢的。 2 ,网络延迟,传过来有延迟,传过去有延迟,延迟还不稳定, 麻烦。 3 ,都有两点解决不了了,接下来不愿意再想了。呵呵,实际上呢,对火球的模拟比对人物运动的模拟要轻松很多, 原因很简单, 火球的方向不会变。下面来看看具体用什么样的结构来实现: 不知道大家是否还记得我去年这个时候提到过的 Dead Reckoning 算法,我们要模拟火球运动的关键就在于一个叫 Moving Objects Tracing Server 的服务器程序,这个服务器是干什么的呢。这个服务器接收主游戏服务器发过来的注册事件的信息, 比如有个玩家, 开始移动了, 那么主游戏服务器就把该玩家的运动 PDU , 包括方向, 速度, 加速度, 起点发给 MOTS (Moving Objects Tracing Server) , 然后 MOT S 自己开始对其运行进行模拟, 当游戏服务器发来第二个 PDU 包的时候,则对各个物件的位置进行修正,并重新开始模拟。那么, 我们模拟的目的是什么呢?当然是发生某些事件, 比如说碰撞, 或者掉入地图的某个陷阱的时候, 会将该事件回发给主逻辑服务器。然后逻辑服务器来处理该事件。那么,对于火球的处理,也和处理其他玩家的同步一样,当接收到玩家的发火球的指令以后,产生一个火球,并指定其 PDU 信息, 在 MOTS 上注册该个运动物体。当 MOTS 自行模拟到这个物体和其他玩家或者 NPC 物体产生碰撞, 则通知主逻辑服务器, 然后主逻辑服务器产生相应的动作。那么关于延迟呢?有些人也许会说,比如说前面有个火球,我本地操纵的小人其实躲过去了, 但是因为网络延迟, 在服务器上我并没有躲过去, 那么怎么算?呵呵, 不知道大家玩过星际没有, 有没有发现在星际中玩多人连线模式的时候, 有一点最特别的地方, 就是控制一个小兵的时候, 点了地图上的某个位置, 但是小兵并不会马上开始移动, 而是有一定的延迟, 但是这一小点延迟并不能掩盖星际的经典, 同样的理论用到这里也成立。对于客户端的控制, 当玩家操纵的主角改变 PDU 信息的时候, 确保信息发送到服务器之后, 再开始处理本地的操作指令, 这样就能保证本地的预测和服务器的预测几乎是没有什么误差的, 即使有很小的误差产生, 以服务器为主, 这样玩家也不会有太大的抱怨。----------------------------------------------------------- ----------------------------------------------------------- --- 网络游戏同步详解之一同步在网络游戏中是非常重要的, 它保证了每个玩家在屏幕上看到的东西大体是一样的。其实呢, 解决同步问题的最简单的方法就是把每个玩家的动作都向其他玩家广播一遍, 这里其实就存在两个问题:1, 向哪些玩家广播,广播哪些消息。 2 ,如果网络延迟怎么办。事实上呢, 第一个问题是个非常简单的问题, 不过之所以我提出这个问题来, 是提醒大家在设计自己的消息结构的时候,需要把这个因素考虑进去。而对于第二个问题, 则是一个挺麻烦的问题, 大家可以来看这么个例子: 比如有一个玩家 A 向服务器发了条指令,说我现在在 P1 点,要去 P2点。指令发出的时间是 T0, 服务器收到指令的时间是 T1, 然后向周围的玩家广播这条消息, 消息的内容是“玩家 A从 P1到 P2”有一个在 A 附近的玩家 B ,收到服务器的这则广播的消息的时间是 T2, 然后开始在客户端上画图,A从 P1到 P2点。这个时候就存在一个不同步的问题, 玩家 A 和玩家 B 的屏幕上显示