作者sitos (麦子)
看板WarCraft
标题[闲聊] LAN mode 比 Bnet mode 顺的原因
时间Thu Apr 19 10:16:16 2007
再仔细地偷看一次 Warcraft III 的封包发现, LAN mode 会比较顺是必然的。
特别是在网路好的时候差距会更加明显,因为网路不好同样会顿到爆炸。
若是游戏当中有任何指令, Host 会马上传给其它 Client ,
告诉它们发生什麽是,理论上会付上一个 timestamp (时间邮戳),
告诉 Client 这件事是什麽时候发生的,因此 Client 就知道,
现在的游戏时间已经到了这里,在这里之前所有发生的事都知道了。
就把游戏的状态更新到该时间点。
在 Bnet mode 底下, Host 每 0.25 秒会送一个同步化封包出去。
告诉 Client 在接下来(没错,接下来) 0.25 秒之内没其它别的事了
因为如果所有的使用者都没有做任何事,那麽 Host 就不会送动作给 Client ,
就没有 timestamp 让 Client 更新游戏的状态,为了让游戏顺利进行,
Host 在没事的时候也会周期性地送封包给 Client 说「没事」。
我们现在来看看两种不同情况的 lag 。首先若是 Client 都有送出封包,
但是 Host 很慢才收到,假设 Client 送出 A 封包是在 T[0] (第零秒),
但是 Host 在 T[2] 才收到封包,因此在 T[0] 到 T[2] 之间, Host 都说没事,
因此 Client 收到也只能照做,在这段时间不论做什麽动作都不会有反应,
直到两秒以後动作才被 Host 收到, Host 收到动作後马上传回给 Client ,
因此在游戏时间中 T[2] 该动作就被做出来了,这就是延迟两秒的情况。
若是 Client 都有送出封包,但是根本收不到 Host 送来的封包,
连「没事」也听不到的话, Client 就无法更新游戏状态(免得状态不一致),
此时游戏当中的角色都会卡在原位,动也不动,直到收到 Host 的封包。
这种情况大致上就是「突然很顿」的情况,一时间人物完全都没有动作。
这麽来看,即使真的「完全都没事」 Client 也得要等 0.25 秒才能更新状态,
在这 0.25 秒之内做的动作就算做了,等到 Host 送回来也会比现在的「没事」封包晚,
因此 0.25 秒左右的 delay 在 Bnet mode 恐怕是免不了的。
0.25 秒也是电话通话品质当中可以接受的上限,单程 delay 超过这个大小,
人就会很有感觉,讲国际电话有时候话常打架,就是因为这个原因。
然而对於比讲话更细密的撑线游戏, 0.25 秒的感受其实满明显的。
那为什麽 LAN mode 会比较顺呢? 因为在 LAN mode 下 Warcraft III 预设更好的网路,
在 LAN 里面比较不用担心流量过大(尤其是 Bnet 的 ladder 是 server 在撑),
因此对於「没事」封包更加大方,它每 0.1 秒就会送一次,
也就是 delay 可以压到 0.1 秒左右。这个量已经符合多数人神经敏感度的极限,
和一般人作尺反应测定的时间差不多,因此这个量是可以接受的。
若是网路状况良好,让 Bnet mode 跟 LAN mode 都可以正常运行,
其 delay 的状况大致就是 0.25~0.5 秒之间与 0.1~0.2 秒之间,
当然越好的网路越接近最佳值,只不过即使都在最佳值,还是有 2.5 倍的差距。
知道这件事以後我曾尝试要把 Bnet mode 的同步化封包量提高,
不过限於无法直接修改 Warcraft III 的程式,所以经过一个晚上的努力完全失败。
所以还是好好修改 ULan 把帐密系统、部族系统、黑名单系统弄出来比较实际。
(因为我昨天睡觉前想到一个好方法,其实这篇文章重点只有最後一行)
--
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.31.132
1F:推 Wayne7878:推,谢谢你的认真回应...我走错版了...歹事... :) 04/19 10:19
2F:推 jack0204:刚好最近学到....又上了一课 04/19 10:33
3F:→ chigi:楼上在上计网概? 04/19 10:36
4F:推 YouCantGetME:就叫你先做该做的事喔- -+ 软工没学好XD 04/19 10:37
5F:推 kikijuice:感谢你的认真回硬 糟 透露出我是西斯洨众了 04/19 10:43
6F:推 sitos:YCGM 要是有做出来就造福所有 Bnet 的使用者ㄟ... 04/19 10:56
7F:推 YouCantGetME:不能再架pvpgn了啦T___T 不然GGC早就被我自己out掉了 04/19 11:01
8F:推 YouCantGetME:ㄟ...sorry我想太深了 我懂你怎麽做了 XD 04/19 11:03
9F:→ YouCantGetME:把已完成跟未完成的计划加在一起 就变超级外挂= =... 04/19 11:06
10F:推 Lushou:高手 浅显易懂 04/19 12:01
11F:推 FrostMaiden:推一个 :P 04/19 12:11
12F:推 jhunfong:太专业 看不懂XD 04/19 12:20
13F:推 Achillean:推认真文,真研究生无双 04/19 13:09
14F:推 snowpoint:呃...Warcraft不是p2p吗@@? 04/19 13:39
15F:推 sitos:是 p2p ,那只是指玩的时候不经过 server 04/19 14:38
16F:→ sitos:但是还是有 host 来确保指令的顺序没错 04/19 14:38
17F:推 AriesJ1M:source code!!(伸) XDDDDD 04/19 15:18
18F:推 sitos:什麽东西的 source code? 04/19 15:41
19F:→ sitos:对了 因为要写新东西 ULan 这边我暂时关掉 04/19 15:42
20F:推 AriesJ1M:随便喊喊 dont mind XDDDD 04/19 16:57