找回密码
 点一下
查看: 4601|回复: 3

魔兽的同步机制初探

[复制链接]
发表于 2007-10-24 21:02:26 | 显示全部楼层 |阅读模式
结合了以前写过的游戏延迟与检测及一些杂项写出了这篇心得:

一张魔兽地图的运行流程可以分两部分,本身就定义好的,和玩家在其间的操作影响。本身定义好的内容包括很多,比如一个攻击1-100的单位,在一个时刻做出的具体攻击必然是个确定值,这个确定值必然要在不同机器上都是一样的,如果不一致,就会产生不同步,通俗的说叫掉线。实际上,这类貌似随机的数值有魔兽程序的本身伪随机来实现,这个随机种子同时会保存在replay中,而replay的作用是模拟重现;有个很有趣的实验,在游戏过程中通过内存修改英雄的数值、玩家的金钱,在replay中是不会表现出来的,因为这是“规划以外”的,一旦在游戏中将英雄的生命改到负溢出而打不死,replay中仍然是该什么时候死就什么时候死,而必然的由于这种蝴蝶效应,后面的扰动越来越大直到完全replay和实际是两回事了。其实这种差错在正常游戏情况下也是有小概率发生的,看replay多且rp好的人可能会惊讶的发现自己的偶像在某录像中有怪异的表现,而在下一次播放时却又一切正常了(这是由replay中的某次扰动所致)。

先说这么多主要是介绍魔兽的运行规程,而重要的地方在于玩家的操作在已定义好的程序流程中的“插入”。在联机的状态下必然要有同步的要求,而实际上,即使是单人,这一要求也是必须的,简单的说,即使在单人游戏也要有延迟的存在。插入的时隙是一系列的离散值。单人、局域网条件下这个最小时隙是25ms,就是说,在这一条件下所有可能的操作延迟均为25毫秒的整数倍。嗯,很好理解吧;主机的延迟往往是最低的,不过即使如此也有平均100ms,而网络条件差的需要更多的时隙来同步该次操作。战网情况下,最小时隙是250ms,就是说即使是主机也会有250ms的操作延迟,实际上由于最小时隙的增大,获得更大的空间进行同步,表现出来就更稳定,可就是”不卡“,付出的代价是可能延迟的程度越高。

对于TriggerSleepAction这个函数,是对实际时间的,同样对于不同机器有同步的要求,据此我们也可以了解到它的实际运行机制了:在出现这条命令开始后,触发被挂起,而每过一个可能同步的时隙进行一次检测,如果符合了到期条件,那么就触发就重新返回运作~这也就决定了为何TriggerSleepAction如此的不稳定,而且最小值还依靠着本地的延迟~在战网环境下,你是不能指望TriggerSleepAction能够做250ms以下的停顿的。

如此,对于检测延迟时间,选择事件和TriggerSleepAction都是可行的方法。
发表于 2007-10-25 09:26:27 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2007-10-28 06:43:56 | 显示全部楼层
主机开了变速齿轮所有客机的速度一起变了。
回复

使用道具 举报

发表于 2007-10-28 14:32:51 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-5-2 20:35 , Processed in 0.083095 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表