同步问题的几种看法

来源: BlogBus 原始链接: http://www.blogbus.com:80/blogbus/blog/diary.php?diaryid=437769 存档链接: https://web.archive.org/web/20041024195745id_/http://www.blogbus.com:80/blogbus/blog/diary.php?diaryid=437769


<<<今天可真是…… | 首页 | 郁闷终结>>> 同步问题的几种看法 参考文献: 网络游戏同步 再谈网络游戏同步 gameres论坛: “那么关于延迟呢?有些人也许会说,比如说前面有个火球,我本地操纵的小人其实躲过 去了,但是因为网络延迟,在服务器上我并没有躲过去,那么怎么算?” 你猜取的是传奇的方法,就是角色死硬大法。 而奇迹采取的策略是,人还是会动,不过伤害照样算上。 虽然在极端情况下,玩家都是要挂回家,但是很多时候,(不被打击)奇迹就显得灵活多了。 不对,传奇用的同步方法是每一步都要经过服务器验证的。也就是说, 在服务器当机的时候,玩家是动不了的。而根本没用到dead reckoning, MU是用的dead reckoning做的行走时的同步,但是在对于处理魔法效 果的时候,并没有使用dead reckoning。 我想说的是星际与目前现有的MMORPG是完全不同的处理方式,星际是100%同步,而MMORPG却可以有不同步的存在,它们内部程式处理机制完全不同。 星际:按照我的理解,它可能是每250ms发送一次脉冲,此脉冲包含了用户的输入指令,并且前提条件是“必须”获得同个游戏中所有玩家的脉冲信息,否则就暂停游戏,这也就是我们如果在网路上玩星际经常会遇到的情况,毕竟星际是即时战略游戏,如果得不到100%同步,那也就意味着个游戏没有公平性可言。 MMORPG:如果因为一个人的延时导致整个场景上百个上千个玩家的暂停,那显然是不合理的事情,所以MMORPG都通过服务器进行统一调度,如果网络慢就是会出现明明看自己躲过火球,但实际却被击中,这点在暗黑里面也经常出现。 在MMOG里使用等待或者估计服务器收到移动指令的时候不需要把所有人都暂停的,只是对于这一单一用户而言会有指令传送的延迟(服务器不会暂停)。现在要讨论的是有什么好的办法减小这个延迟(估算或者其他)或者避免让客户端感觉到卡,而尽量减小碰撞检测(如火球)的误差。 奇迹MU是边发送指令给服务器边移动客户端,然后再根据最新的指令纠正上次的误差,所以感觉不到卡。 也就是说,MU为了解决客户端有卡机感觉的问题,使得碰撞检测的误差更大(我们现在就是讨论一下有什么更好的方法解决这两个问题) 呵呵,其实具体的原理,我想我在我的 http://www.gameres.com/Articles/Program/Abstract/DeadReckoning.htm 这篇文章中已经说得比较明白了,这次提出来的,只是一个用来实现 的结构。斑竹提出来的问题,在我那篇文章中就有讲到,每个用户数 据结构中,都保存有自己的延迟的值,如果值太大的话,则做预测拉 扯同步,如果值不大的话,则可以适当延迟。 而实际上呢,我在这篇帖子中,之所以要提出星际,是因为不管ping 值大或者小,实际上都可以适当的延迟一小会,来减少部分误差,其 实用不着完全延迟到直到服务器有响应为止,这个值是可调的。 对于没收到服务器验证就开始运动的物体,之后和服务器返回的数据 有误差的话,其实我在另外一篇WORD文档中有比较详细的介绍,因 为其中有一些图,这里不太好上传。其核心思想还是dead reckoning, 就是用近似模拟+拽来实现,而且拽的时候的话,还有不同的方法。 传奇就是使用同步更新技术,角色每前进一步或者发一次魔法都要把数据告诉服务器,并且等待服务器回传,如果网速慢的话,这个等待时间就很吓人了,表现为角色卡在那儿了。我认为传奇这个设计非常失败。 奇迹就不同了,它不是采用同步更新,它采用的是异步更新技术,说通俗点就像拦截导弹,它发射后是不会去死等雷达站传回的定位信息的,如果雷达站传回的信息及时,那么它就会不停地修正自己的飞行姿态,如果雷达站的传回的信息被干扰,那么大不了导弹定位信息不准确罢了,它不会陷入等待状态,而是继续飞(拦截导弹不可能在无线通信断掉的时候就停转发动机吧?!),只是打不中目标罢了,整个飞行过程是连贯的。 所以在奇迹里就是类似这个原理,那怕是服务器时断时续的情况下,玩家也不会有卡死的感觉,因为照样能走路,只不过有可能出现这样的情况,当网很卡时,如果你与怪离得很远,怪照样能打到你,呵呵,这就是异步更新带来的不准确性,当然,在网卡的情况下异步更新技术都能让玩家觉得不是很卡就肯定要付出这样的代价的。世界上哪儿有十全十美的呢。 而传奇采用的同步更新就会让你感觉怪打得准一点,但是非常卡,呵呵,就是这个道理,选择了准确,就不能解决卡机的问题。 我自己的看法是在做广域网的游戏,网络廷时和网络质量不好是客观存在的,因此不可能再像传奇那种游戏完全采用同步更新技术,合理方案的应该是主要采用异步更新,适当采用一些同步技术。 对于局域网竞技类游戏,由于要求很高的公平性,而且不存网络时断时续和长时间廷迟这些问题,当然就可以准确性放在第一位,这种情况下才主要选择同步更新技术,至于程序上怎么实现,那就太多了,都是具体实现的问题,效果大至都差不多 楼上说得不太准确,这种现象并不是必然的,MU里面玩家离开了,怪物还能打到人,只是因为MU选用的同步方法不对,并不是像你所说的导弹跟踪那样,MU选用同步的最小单位是鼠标点击,也就是说,是坐标,而不是速度和方向等变量。也就是说,MU的模拟就好象火车一样,是一站一站的,玩家鼠标点一下,然后行走到那个点,这个时候服务器上的怪物对周围环境的判断也将是以那个点为基准。 而我所说的dead reckoning的话,则和你说的导弹的情况很相似,只要提供了速度和方向,将不停的运动下去,而客户端发来的,只是对速度和方向的修正,而不是终点坐标信息,不需要知道终点在什么地方,只需要知道该在什么地方停下来,这样能保证在运动过程中,和客户端的时间基本一致,因为在刚刚开始运动的时候,有一个校对时间的机制,通过这个校对时间之后,不过多大的网络延迟,模拟出来的运动应该都是一样的。。 如果由于客户端的FPS过低造成的不同步该怎么解决呢? 我想先让客户端稍微停顿一下,当然要控制在感觉不出来的范围内尽量利用能够利用的延迟,再用上预测拉扯,根据延迟计算一个移动速度把人物的误差距离移动过去。。。。。考虑中 //========================================= 上帝掌握着一台P4以上的Server,控制监测着世间万物的同步。他老人家相信任何物种都不会打算破坏这个规则。因为万物同步条例第一条已经做出明确规定。任何物种预破坏这条规则,就将被KickOut。 破坏案例一[延迟]、人类物种动作慢了一点点,结果被车撞死了。[没有躲开] 破坏案例二[加速]、人类物种动作快了一点点,结果被车撞死了。[闯红灯抢道] 尽管改条例如此严格,世间万物依然在这个虚拟的世界中,忙得不亦乐乎。

点评:这个游戏设计的不错,同时在线数最多,还都不太想退出游戏不玩了。其实换个游戏玩说不定也不错的。张国荣就换了新游戏,再也不回来和大家玩了。呜呜呜。。。。。。 我一直在研究这个游戏,希望能够找到好的制作思路,刚刚终于被我发现这个游戏服务器内存的释放方式是用类似Java的垃圾收集站。例如死亡后,内存没有被立即将释放,而是放在垃圾站中,用鬼魂的标记将其标注,等待下一个轮旬或者其他低级别线程来处理。这个思路不错,我决定用到我的服务器设计中去。 该游戏服务器还是分组的,采用了某种分布集中式的计算管理概念。每组都有配备管理员,有默罕默得,释迦牟尼,耶稣等,分别下社不同的GM。但是好像没有设置客服,或者提供客服电话,可能是由于现在还没有收费的原因。这个游戏的测试期间好长阿。很多前辈玩家都不玩了,不过还是写下了很多游戏心得,例如《上下五千年》就是介绍该游戏的发展过程以及一些背景知识的。 不过既然是测试期间,一定会有BUG吧,有没有找到的,能不能共享一下阿。或者有没有熟悉GM的,能不能帮忙修改一下基本属性,加点生命最大值,或者就算给点钱也可以阿,玩这个游戏赚钱太辛苦了。 hongyu 发表于 2004-10-12 | 引用Trackback(0) 服务器只是做消息的转发,不做碰状检测的。 碰状检测让每个客户端自己去做。 另外,碰撞检测时没有办法自发进行的,即使你用消息处理方式其本质也还是消息循环,是由外界进行不断的轮训来处理的,实际上也是外部系统进行检测。就想真实世界中一样,碰到物体不是你自己决定的,而是由自然界决定的。 hongyu ( ) 发表于 2004-10-12 15:39