找回密码
 点一下
查看: 3297|回复: 10

[不学无术流] 乱弹war3的操作传达和同步机制

[复制链接]
发表于 2009-3-4 11:14:01 | 显示全部楼层 |阅读模式
虽然不是确认,但根据观察得出以下结论:

1. 主机玩家的时间轴比非主机玩家早。比如主机走到游戏时间10秒的时候,非主机可能9.5秒。

2. 玩家之间传递的消息至少是“命令”级别,例如“某单位,移动,x,y”,而不是操作。
这一点从录像数据可以看出。

3. 必然存在一个从非主机玩家到主机的传输(废话)

4. 一个操作实际在何时执行,由主机决定,因为主机要确保所有人在时间轴的同一个某时刻做一样动作。

5. 实战中主机玩家从操作到效果延迟很小,非主机玩家从操作到效果有相对较大延迟

综合起来的推论:任何玩家的操作,首先被war3转化为命令,而后传输给主机。

主机把收到的命令处理后,决定一个时刻,把命令连同时刻发给所有玩家。

每个玩家都在各自时间轴上的该时刻执行该命令。

因此尽管每个人的实际时间是不一样的,但在游戏时间轴上的行为完全一致,所以保持稳定同步。

前面说过主机的时间轴走的早一点。例如某一时刻,主机的时间轴是 100秒,某非主机玩家甲的时间轴是99.5秒

此时甲点一下右键,形成一个有效的命令,某苦工,右键,x,y,发送给主机,延迟0.5秒,于是主机收到时时间轴是100.5秒

主机立刻安排,在100.6秒时执行该命令,发回给所有人,延迟0.5秒,甲收到的时候时间轴是99.5 + 0.5 + 0.5 = 100.5秒

他在100.6秒时执行,还来得及。在甲看来,他99.5秒时做出操作,100.6秒执行,延迟1.1秒

而如果延迟 > 时间轴,则会出现俗称“幻灯片 + 加速”的现象,因为要赶时间轴。


而主机如果在100秒时做一个操作,决定在100.1秒时执行,发给所有玩家(包括甲),延迟0.5秒,

甲收到是在99.5 + 0.5 =100秒,于是在100.1秒执行。在甲看来,主机玩家在时间轴100秒时做出一个操作,100.1秒就执行了,

延迟只有0.1秒

当然数据是夸张的。。实际上解释了为什么主机的操作很畅快而其他人有延迟。

评分

参与人数 2威望 +3 收起 理由
血戮魔动冰 + 1 优秀文章
kook + 2 优秀猜想 用多开加变速 ..

查看全部评分

 楼主| 发表于 2009-3-4 11:22:38 | 显示全部楼层
接前。主机的操作畅快是因为主机的时间轴刚好比其他人提早了大约延迟毫秒那么多的时间

所以操作传达过去之后,大致对应正确的时刻,如果按时间轴来看就好像延迟=0


=========奇怪的分割线========

其实是打算做伪造操作功能

若找到玩家把翻译好的命令发送到主机这一步的程序,了解其构造,则可以伪造命令发给主机

而主机接受后也当作正常操作来处理,之后的一切都顺理成章,不用管也有效

=========更加奇怪的分割线==========

这引发了一个想法,那就是,你认为主机会检查到来的消息是否“合法”么?

所谓合法就是,他要检查这是否伪造或是否不应该由某个玩家发出?

若不检查,实际上主机和A,B两个玩家,A完全可以伪造B的操作

B把一个B的单位b移动了一下。这个消息如果由B传达给主机,完全没问题

如果由A传达给主机呢?消息本身就叫做“B,b,移动,坐标”,至于是谁发的,对于主机又有什么区别呢?

如此A就伪造了一个B的操作。以此类推,A可以把B的基地升级取消,A可以命令B退出游戏,等等。。
回复

使用道具 举报

 楼主| 发表于 2009-3-4 11:26:32 | 显示全部楼层
实际上,要知道一个操作是否“合法”,必须用游戏内的情况来判定,

例如该单位是否属于某玩家或者是否存在共享操作;

个人猜想这种判断是不可能的,至少他根本不是消息处理机制的层次。

正常情况下,A玩家无法伪造B玩家单位的操作,只是因为他根本发不出这个命令。
回复

使用道具 举报

发表于 2009-3-4 12:02:01 | 显示全部楼层
有外挂制作达人看一看就知道了
回复

使用道具 举报

发表于 2009-3-4 12:16:07 | 显示全部楼层
LZ是外挂制作达人么?
回复

使用道具 举报

一抹煞白 该用户已被删除
发表于 2009-3-4 12:38:02 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2009-3-4 12:59:13 | 显示全部楼层
评论:首先,了解了魔兽的内部的命令传输。
解释得很好,(不过我觉得可以配个线形图)
但是真正的实际操作性貌似很强~~
回复

使用道具 举报

发表于 2009-3-4 20:25:04 | 显示全部楼层
貌似单位动作里面可以对不属于自己的单位发布命令.

其他动作里面也有类似的东西(UI键,Esc键)捣乱是没问题吧, 我想
回复

使用道具 举报

发表于 2009-3-12 23:27:50 | 显示全部楼层
以前的VS必胜挂就是冒充别人发送失败结果给VS,但现在VS对TCP(或者IP,或者其他)有验证了,必胜失效了。
魔兽那么多优秀程序员当然考虑得要周全多了。
回复

使用道具 举报

发表于 2009-3-13 09:46:55 | 显示全部楼层
仔细追究的话,时间轴先后差异实际会存在,因为在这个主机发布同步命令机制下做到真正时间轴完全一致并无必要且不容易。
但时间轴差微乎其微,并非是延时的主要影响因素,或者说当初设计时就从这点上没考虑过。。
主机并非没有操作延时,实际上100ms左右的延时“正好”吻合正常人的(非触手)指尖到大脑的神经传导速度。
可以认为延时的主要决定是主机的时间轴里切入动作的判断,至于对非主机预留了较大的空间是考虑网络的重负载和拥堵等不利情况。
总之我的看法是并非特意让主机的时间轴走在前面的(无此必要)。
如果使用wdr这类可修改主机延时判断的工具,可以让主客端的延时都达到100ms以内。
回复

使用道具 举报

发表于 2009-3-13 17:14:34 | 显示全部楼层
以下 这些大都是猜测,错了的话请大家指教 :-)

魔兽也许是这么同步时间的:  
客户端的命令: 一个客户端发送一个动作给主机但并不立即执行(比如移动,只给主机),主机收到后把它发送给所有客户端(并执行);所有客户端收到后(包括原发送方及其它)才开始执行,所以往往有延迟(时间大约是“命令被发送到主机时间+主机把命令返送回的时间”)。(但盟友模式说话和私聊说话不一定给主机,否则主机可以偷看)。

主机命令: 执行并直接发送给每个客户端。

时间快慢: 主机隔一小会时间(代码循环一次或几次)发送一次“时间流逝”命令给每个客户端;如果他们谁没有接到,谁就会立刻停止并且等待(卡住);主机时间走的快慢决定了所有客户端的时间的快慢(变速精灵在主机时有效)。

我想魔兽可能所有玩家的一切重要数据(如命令)都通过主机交流,并且各自验证。这种架构设计简单,不容易掉线或卡住,不容易作弊


星际似乎就不是通过主机交流而是每个客户端各自交流,然后动不动就卡住,延迟。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 19:33 , Processed in 0.433445 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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