论延迟:守望先锋延迟/延迟补偿的本质
最近看到了不少讨论延迟的贴子,如技能释放延时问题,求解
一直存在一个问题,比如:看见对面安娜睡眠针的弹道飞过来或者安娜在释放睡眠针的时候,我源氏马上按下E,但是E并不能马上开出来(没有动画和声音效果),然后被睡,有些时候又能开出来。只有在安娜释放技能之前先开E,才能100%将子弹反弹。我不知道这是什么原因,要说是网络延迟吧,PING70 ,RTT70 ,也不至于会按了技能按键,不能马上放出来吧?键盘有问题的话,也不会偶尔出现这种状况吧?
相信不少人一定遇到过类似的问题:
我这枪明明点中他头了,都飙血了,结果显示没有命中
我猎空屏幕上已经闪现了,还是被麦克雷的闪光弹拉了回来
明明我屏幕上都过拐角了,结果还是被打死了,死亡回放看我还在外面
遇到这种问题,不少人的回答一概是“延迟补偿”,有些人则会指出“这只是延迟问题,和补偿没有关系”。但时间久了,大家还是云里雾里:真相实际上是什么呢?
实际上,上面三种情况的成因各不相同!
今天,就让我带大家走进守望的 netcode,也就是守望处理延迟的方式。简单来说,守望在延迟方面的规则可以概括成 3 点:
不信任客户端,服务器才是真谛
照顾进攻者,除非延迟过大,或者:
保命技能一旦被服务器成功接收,则不能被撤销
让我们一条一条进行解释。
1. 不信任客户端,服务器才是真谛
大家都知道,一些游戏是存在“锁血挂”,“加速挂”之类的东西的。这些通常都是因为,服务器轻信了客户端传过来的数据,给了外挂机会。然而,这些东西在守望里根本不可能存在,因为:
守望服务器只相信客户端的按键/鼠标移动,其他一概不信
然而这就产生了一个问题。如果我的延迟 (即原来的 RTT) 是 60 ms,我在开枪后 60 ms 后才能知道有没有打中。这样的延迟感太大了,(几乎) 没有游戏会这样去做。解决方法是,客户端在本地先自行模拟,等拿到服务器的答复了,发现有问题,再撤销。于是乎,在一局游戏中,服务器有一份游戏世界,每个客户端也有一份游戏世界,一共有 1 12 = 13 个。也就是说,在时间线上:
你对手看到的你 < 服务器看到的你 (真正的你) < 你自己看到的你
具体差多少呢?公式如下 (其中 16 ms 是服务器两次计算中的间隔,即 1 / tick rate):
时间差距 = 延迟 / 2 16 ms
例如,你的延迟是 60 ms,你对手的延迟是 4 ms,那么世界线是这样的:
看到这,大家可能就要更迷糊了:所以站在对手的视角,他眼前的猎空,实际上是 18 ms 前的猎空。所以他开枪的时候,还要考虑 18 ms 的延迟?这怎么玩?这就要谈谈第二点:
2. 照顾进攻者,除非延迟过大
答案是:进攻者不需要考虑延迟。你看到猎空在哪里,就打哪里。
也就是说,服务器在进行命中判定之前,会根据开枪者的延迟,进行倒带。对于你对手打出的子弹,服务器会倒带 18 ms 进行模拟,如果发现命中,你就真的死了。你的本地游戏世界就会撤销你后面的操作,更正为服务器上的正确版本。就算你认为你已经过拐角了,只要对手的世界线上你还在外面,你就还是危险的。
当然,如果对手的延迟太大,这就有些难受了。所以,服务器倒带上限为 220 ms。
但这就意味着,如果你用了保命技能,你还是可能会被打死。于是暴雪在这条规则上加了个例外:
3. 保命技能一旦被服务器成功接收,则不能被撤销
这里的保命技能包括一些无敌技能 (如猎空闪现,死神幽灵形态,和尚圣) 和位移技能 (如猎空闪现,法鸡 shift)。保命技能一旦被服务器成功接收,该技能就不会被撤销。
在了解了这三条规则后,让我们看看上面三个例子:
1. 由于丢包等原因,客户端视角中的敌人位置可能是错的(丢包率越高,越容易发生)
在这里,猎空其实已经动了,但因为丢了个包,麦克雷以为猎空没有动,并打中了她,于是客户端飙血 (但不显示击中图标)。服务器发现:你这世界线不对呀,猎空动了呀。于是把麦克雷拉回正确的时间线,没有命中符号,不扣血。
2. 你的本地世界只是对未来的模拟,还没有真的发生(延迟越大,越容易发生)
你在自己的时间线上闪走了,但你的世界线比服务器快 46 ms,并没有真的发生。如果在这 46 ms 之内,真实的你 (服务器上的你) 被闪光弹晕住了,你的闪现虽然是保命技能,但还没被服务器接受,要撤回。于是就出现了上面所说的“被拉回来”的情况。
3. 敌人眼中你还在外面(对手延迟越大,越容易发生)
这种情况就是大家常说的“延迟补偿”。在这个例子中,服务器会倒带 18 ms 进行命中判定,所以就算当前的真实世界中你进了掩体,也会被倒带而被打中。
怎么样,大家明白了吗?
- 上一篇: 剑网3指尖江湖江湖炙食谱配方
- 下一篇: 守望先锋攻略:名词解释
新锐游戏抢先玩
游戏攻略帮助你
更多+-
11/24
-
11/24
-
11/24
-
11/24
-
11/24