关于游戏掉帧(转载至b站爱好逍遥)|T3


3楼猫 发布时间:2022-08-21 04:31:32 作者:量子波动可乐 Language

延迟狗真恶心,我打他全是假红”

“苹果狗真恶心,我打他全是假红”

“苹果拉出来能先看到安卓的,安卓的还没看到苹果的就掉血了”

“高延迟横拉能先看到低延迟,低延迟还没看到高延迟就掉血了”


“md又是延迟狙我都退回墙后还是死了”

《真理》—— 苹果服和高延迟枪战中占据优势

......

然而事实果真如此吗?

与单机游戏例如求生之路和反恐精英在本地架设服务器进行联机游戏的“客户端-客户端”架构不同,网络游戏是以“客户端-服务器”为架构将全国各地的玩家们联系起来的。玩过求生之路的朋友应该知道,联机对战时如果房主的网络卡了,那么房间内其他玩家都会变卡。但网络游戏的主机为官方游戏服务器,因此某个网络不稳定的玩家并不会影响到其他玩家的网络连接状态。在网络游戏中,玩家本地客户端将移动开火等数据处理后发送到官方服务器,经服务器计算后再将计算结果例如伤害判定反馈给客户端的玩家。图1和图2展示了不同网络延迟下客户端与服务器之间的连接关系。

图1:不同网络延迟下玩家与服务器之间的响应延迟滞后情况
图2:不同网络延迟下客户端与服务器交互所需时长(类比距离远近)
开火到服务器判定造成伤害是需要时间的,FPS枪战游戏从开枪到击中敌人的过程为,玩家射击敌人-数据上传-服务器计算伤害-数据下载-玩家得知结果,网络延迟越高时,数据上传和数据下载所需的时间将更长。由BV1ef4y1y7J3在3:57的高低延迟对狙测试可知,110ms和50ms同时开枪对狙,50ms只需要0.05秒就能告诉服务器我开了枪,而110ms则需要0.11秒才能告诉服务器我开了枪,因此对狙时同时开枪,即便高Ping视角中已经完成了开枪动作,但依然会被低Ping所击杀,并且死亡时间在开枪的0.11秒后。一个很简单的例子,由BV1ef4y1y7J3在1:50对枪测试可知,假设击杀敌人只需要4发子弹,30ms需要连射5发就能够击杀敌人,而110ms则需要连射6发才能够击杀敌人。并不是枪的伤害变低了,而是110ms打出第1发子弹的数据还在向服务器传输的路上,当打出第6发子弹时前4发子弹的数据才传输到服务器产生伤害并击杀敌人,最后2发子弹实际打在了空气中,而30ms只有1发子弹打在了空气中。那如果110ms和30ms都只打4发子弹呢?是一样可以击杀敌人的,但都无法立即获得击杀反馈,110ms需要等待第4发子弹打出后经过0.22秒才能得知自己击杀了敌人,而30ms只需要等待0.06秒就能得知击杀敌人这个信息,因此低延迟玩家可以抢在高延迟玩家之前进行伤害判定,更早完成击杀获得反馈并停止射击。

那么移动开火呢?由BV1ef4y1y7J3的2:00提前枪测试可知,首先由110ms静止架点,30ms横拉开火。测试中30ms看到了110ms的全身,而110ms连30ms人都没看到就开始掉血。30ms开火后经0.03秒的数据上传便可造成伤害,然后再经0.03秒的数据下载便可看到伤害数字,30ms所经历的闭环时间为0.06秒非常短,因此在30ms视角中从开枪到显示伤害几乎是同时的。反观30ms静止架点,110ms横拉开火。110ms开枪后经0.11秒的数据上传后才可造成伤害,然后再经0.11秒的数据下载才可看到伤害数字,110ms所经历的闭环时间为0.22秒更为长,因此110ms横拉开火看到30ms全身并且都退回墙后了才显示伤害。那么为什么实验中30ms受伤时至少还能看到110ms漏了一条腿,而110ms连30ms的人都没看到就开始掉血呢?这是因为实验中110ms的网络延迟比30ms高,110ms需要0.11秒才能完成数据接收看到对手,而30ms仅需要0.03秒数据接收即可看到对手,30ms的0.03秒比110ms的0.11秒快了0.08秒。如果110ms看到30ms出现就立刻作出反击呢?当110ms看到30ms出现时,已距30ms有效攻击110ms已长达0.11秒,110ms开火反击后还需要0.11秒的数据上传才能对30ms造成伤害,也就是说110ms被打了0.22秒后才能做出有效反击,这段时间内30ms早已在服务器里对110ms造成了大量伤害甚至做到了击杀,因此Ping越低才能越早看到敌人出现并做出有效反击。但在进攻和架点的情况下,无论高延迟还是低延迟,架点方都是等待接收敌人出现数据的被动方,进攻方都是传输开火造成伤害数据的主动方,因此主动进攻可以弥补高延迟所带来的不利影响。具体测试可见BV1SJ411A7QV。

即使30ms的网络延迟并不高,但也必须经过0.03秒的数据接收后才能看到敌人的出现,导致双方掉血时好像都没看到敌人出现一样,这是因为你的网络延迟Ping值并不为0ms,只要Ping值不为0ms,即使是1ms的网络延迟也需要经过0.001秒才能看到敌人出现。网络延迟Ping越低,就能越早与服务器完成数据交互,被进攻时才能更早看到对手在服务器中位置的改变,避免没看到人就掉血的情况。值得一提的是,无论30ms还是110ms,在他们数据上传的0.03秒和0.08秒里,动作都还未告知服务器,因此不仅不会出现在敌人的视野里,也无法对敌人造成伤害。流言中“你高延迟人家都看不到你就开始掉血了”便不攻自破,高Ping玩家横拉的确能先看到静止的对手,但这并不是对手的实时位置,对手在移动看到的则是他0.1秒之前的位置,高Ping玩家永远活在滞后的世界中。高Ping玩家移动开火,会与其他玩家一样,只有当服务器接收到来自客户端发送的动作数据后,才会出现在低Ping玩家视野里拉枪开火和造成伤害。如果高Ping能做到让对手看不到自己能把他击杀的话,那几百上千的Ping岂不是能做到幽灵杀人,断网重连在家就能直接灭队?移动也好开枪也好,这些动作传输到服务器并产生效果是需要时间的,这段传输时间就是通常所说的网络延迟。但这么说并不严谨,因为Ping本身并不是网络延迟,而是一种表达本地与服务器之间数据包交互速率的方式,延迟是传输速率低导致了滞后效应所产生的现象。


断网后无论走多远,一旦网络恢复就会被拉回原位,无论开多少枪都无法造成伤害(可见BV1ef4y1y7J3中2:52断网测试),这是因为断网时任何动作的数据都无法传输到服务器,你看其他玩家都没动,但在其他玩家视角里其实只有你没动。有时走3步突然被瞬移拉回2步,这并不是你的网络延迟高了,而是因为你的网络丢包了,你看其他玩家在滑步,但在其他玩家视角里只有你在反复前后闪现。假红和瞬移早已是CF手游玩家老生常谈的问题,原因有两个,首先最大的问题是服务器Tickrate过低,导致服务器判定次数太少引起的假红(图3展示了不同Tickrate下Hitbox的刷新频率)。FPS游戏中受击实体Hitbox和人物模型并不完全匹配,对于快速移动的物体,即使是几毫秒的微小差异也会存在巨大的误差,Tickrate简单来说是玩家Hitbox在服务器里的刷新频率,频率越高Hitbox在服务器中每秒刷新的次数就越多,子弹判定就越准确,人物模型在服务器中的移动就会越细腻。频率越低就越容易出现打中敌人却无法造成伤害,越容易看到敌人和队友瞬移的现象,特别是鬼跳时有发生的后撤步和瞬移,大家应该都不陌生。假红并不是你延迟高,也不是对方延迟高,而是在服务器中你的子弹打在了Tick空隙没有击中Hitbox,因此没有造成伤害。瞬移则因为服务器中Hitbox刷新次数过低,突然的变向运动让一段连续的Hitbox在一个Tick中产生了巨大的空隙,两个相邻且相距甚远的Hitbox导致了人物模型在运动过程中的瞬移,只有提高服务器刷新率Tickrate才能填补Hitbox在移动中的空隙。当然还有一种明明没打中敌人却造成了伤害的情况,这也是因为Tickrate太低,Hitbox无法紧跟人物模型,导致打在运动轨迹身后的空气上依然能够造成伤害。其次是不同玩家之间存在网络延迟差,网络延迟会影响客户端上传到服务器的数据,影响服务器Tickrate的检测率。网络的不稳定性会导致客户端与服务器出现判定不同的问题,即客户端判定玩家击中了A击中玩家B,但服务器判定玩家A并没有击中玩家B,特别在刀战这种频繁移动和跳跃的模式中,假红和闪现的现象更为明显。这需要官方优化服务器的发包方案,通过减少丢包率来减少假红。

图3:不同Tickrate下Hitbox的刷新频率
FPS枪战游戏中还有一种情况经常出现,我方视角明明已经躲回了墙后,但在敌方视角中我方身体并未完全躲回墙后,敌方还可以继续造成伤害,导致在我方看来是死在墙后的反常现象,但在敌方看来是死在墙外的正常现象,这与Tickrate和Ping值都有关系。由于Ping值差,我方视角虽然已经移动回到墙后,但这个动作传输到服务器需要时间,服务器再传输到敌人视野里也需要时间,在这段时间内虽然我方视角已经开始移动,但在敌方视角中我方依然保持未动。只有当服务器接收到移动这个动作的数据后,你的位置在服务器中才会发生改变,当对手接收到来自服务器你的位置发生改变的数据后,在敌人视野里你的位置才会发生改变。并且这个过程还会受到Tickrate的影响,即使敌方子弹描边打在了运动轨迹后的空气上击中了Hitbox也会造成伤害。

补充一点,什么是延迟补偿机制?“为什么明明我都走到了B门还被中门的潜伏者狙了,在他的视角里我才刚走到中门?”。延迟补偿是为了避免不同Ping值的玩家在对战时引发的逻辑问题。假设玩家A在开火时命中了玩家B,玩家A的数据上传至服务器的途中玩家B走开了,当数据到达服务器时正好玩家C路过,导致击杀的是玩家C而不是玩家B。为了避免这种现象,延迟补偿会让玩家A最后击中是玩家B而不是玩家C,即使玩家B回到墙后还是会被击杀,这也是所谓的子弹拐弯。虽然玩家B死在了墙后会很生气,但前提必须是玩家A开火命中了玩家B,如果没有命中依然是无法造成伤害的,这不能怪玩家A的延迟太高,而是玩家B在1秒前漏的身位太大了,简单来说高Ping玩家是在跟1秒前的低Ping玩家战斗。(“Lag Compensation for First-Person Shooyer Games in Cloud Gaming” <Autonomous Control for a Reliable Internet of Service>)。虽然存在延迟补偿,但并不会影响谁先看到谁,就正如上文所说,墙后横拉方一定能先看到静止架点方,静止架点方如果想更早看到敌人的出现,就必须通过降低自己的网络延迟,来提高接收服务器发送给你的‘’敌人从墙后出来了‘’信息的接收速率。

Tickrate是官方游戏服务器的属性,玩家无法提高或优化。但网络延迟越低的玩家伤害判定就越快,看到敌人出现所需的时间就越短。低延迟玩家无论做什么,接收和传递数据都会快人一步。因此FPS枪战模式下低延迟是优势方,高延迟是劣势方,但主动进攻可以弥补延迟差所带来的不利影响
(侵权删)

© 2022 3楼猫 下载APP 站点地图 广告合作:asmrly666@gmail.com