当大家在游戏中遇到一些不可思议的现象时,往往会认为,这是对方玩家使用了第三方辅助软件。而事实上,这些莫名其妙的现象,绝大多数都是由网络延迟,也就是大家平时所说的“卡”引起的。在这里,我简单地给大家分析一下大多数由于延迟而引起的各种情况。
本文的针对对象为《真·三国无双online》玩家群体,文章中所涉及的内容,如非特别指明,都是以《真·三国无双online》为参考环境。鉴于并不是所有玩家都接触过网络技术方面的知识,我在正文里将大部分技术名词、技术原理都口语化、简单化了。
一、游戏延迟的分类
单个的玩家要连接游戏,大致的连接是通过这样的路径来实现的:
玩家电脑 - 玩家宽带 - 玩家所在城市电信运营商路由器 - 服务器所在城市电信运营商路由器 - 服务器机房 - 服务器
在这条路径里的任何一个环节出了问题,都有可能造成游戏延迟。而游戏延迟可分为网络延迟和非网络延迟两种,我们可以把主要的延迟大致归纳如下。
非网络延迟
1. 玩家电脑性能引起的延迟:主要由玩家电脑的CPU、内存、显卡等硬件设备不能满足客户端需求所引发的延迟,其主要表现为:
内存不足:游戏场景切换、进入战斗画面时读取数据的时间特别长,最典型的就是在进入战斗读取数据时非常慢,而进入战斗后基本正常。
显卡性能:当游戏画面复杂到达一定程度时,会出现游戏画面丢祯的情况,也就是画面一闪一顿,俗称“慢动作”的情况。
CPU性能:一些电脑的CPU散热性能不好导致温度过高,或者CPU占用量太大时,也会短时间出现“慢动作”的情况,典型表现是不少玩家都遇到过的,在据点附近或者兵多的大地图会特别卡。
此外,也可能会出现某个版本的客户端因素,导致原本能正常运行游戏的玩家电脑,不能满足游戏运行需要,从而出现以上情况;而且随着版本的提高,对电脑的硬件需求也是会逐渐提高的,尤其是一款3D格斗游戏。
2. 服务器性能引起的延迟:主要由游戏服务器硬件性能不足而导致玩家出现的延迟。
造成服务器延迟的原因,主要是因为某个局部场景内的玩家过多,或者整个服务器登陆的玩家数量过多。其主要表现为:
网速正常(开启个人属性界面、读取个人信息、聊天信息、地图切换速度均正常),自己身边的玩家形象迟迟不能刷新。典型表现为不久前的统一庆典。
除此之外,由于服务器性能而引起的延迟可以说几乎没有。
网络延迟
3. 玩家网络引起的延迟:由玩家本人或局域网的网速限制、下载、病毒而引起的网速迟缓,“迅雷党”就是其中的典型。
4. 电信运营商引起的延迟:由玩家所在城市电信运营商、服务器所在城市电信运营商这一条线路中造成的网络延迟。
如电信用户登陆网通服务器,延迟问题主要就是出在电信网络和网通网络的信息传输上。
又如电信2区近一段时间的大范围延迟,问题主要出在服务器所在城市电信运营商:四川(绵阳)电信的线路问题上。
5.服务器网络引起的延迟:由服务器所在机房的网络原因引起的延迟,比如游戏服务器受到大规模DDOS攻击。当然,目前还没有遇出现过类似问题。
总的来说,大家遇到的游戏延迟主要都属于第1、3、4这三种情况。而我们这里主要针对的,是网络延迟的情况分析。
二、数据传输的基本流程
通俗的讲,游戏信息在网络传输的时候,上行和下行使用着不同的通道。大家双击自己的“本地连接”就可以看到,发送出去的数据包和接收到的数据包是分开的。
真三这款游戏在运行时,是本地运行和接收服务器指令同时进行的,游戏内自己的人物动作由本地产生并提交到服务器,服务器通过攻击判定后计算出损血情况并同步给玩家电脑。
我们以两个人单挑为例,简单分析一下真三的数据传输过程。
参与对象:玩家A、玩家B、服务器。
玩家A出招:电脑A生成“出招”的相关数据包,发送给服务器,同时在玩家A的游戏界面内产生出招动作。
玩家B出招:电脑B生成“出招”的相关数据包,发送给服务器,同时在玩家B的游戏界面内产生出招动作。
服务器同时收到双方出招数据:根据招式的强硬度,计算攻击判定和双方的体力损失。
服务器先收到玩家A的出招数据:判定玩家A攻击有效,计算玩家B的体力损失。
服务器将攻击判定,及体力损失返回给玩家A、玩家B。
根据攻击判定,在双方本地电脑内各自产生后续效果(吹飞、倒地等等)。
我在这里要强调的是:玩家A和玩家B产生的后续效果并不是完全一致的。当玩家A和B的延迟不一致时,如果差距过大,就可能会出现这样的情况:
服务器将攻击判定,及体力损失返回给玩家A、玩家B。
玩家B收到服务器返回数据(玩家B后仰),于是等待后仰消失(这是玩家B本地产生的动作),发起“跳跃”指令并向服务器提交新的数据包。
服务器收到玩家B的跳跃数据,开始进行指令判定,并判定跳跃有效,并发送给玩家A和玩家B
玩家A这时才收到服务器返回数据(玩家B后仰),于是等待后仰消失(这是玩家A本地产生的动作),再次发动攻击并向服务器提交新的数据包。
服务器判定玩家A的攻击为浮空攻击并返回相关数据,此时玩家A看到的情况是:玩家B被砍但是不掉血。
玩家B收到服务器返回的浮空攻击相关数据,被砍飞并受身……(后续省略)
玩家A收到服务器返回的浮空攻击相关数据,发现玩家B本来正受地面攻击,却突然受身跑掉。
这里只是举一个例,具体的各种延迟引起的情况,我将在后面做详细分析。
三、各种延迟引发的典型现象分析
1. 瞬移
现象:玩家A看到玩家B瞬移
产生原因:1.玩家B网速不稳定,主要是玩家B网络上行速度受限
2.玩家A网速不稳定,主要是玩家A网络下行速度受限
分析:
玩家B面朝玩家A移动,提交数据到服务器;
服务器将数据传递给玩家A,玩家A看到玩家B向自己移动;
玩家B转身反方向移动,提交数据,但是由于玩家B的上行网速受限,服务器没有及时收到该信息;
因为服务器没有返回玩家B的后续动作,玩家A在本地看到玩家B仍然根据先前的指令,一直朝自己的方向跑;
玩家A攻击玩家B,提交数据;
服务器因为没有获得玩家B的数据,因此判定攻击无效;
玩家A收到服务器返回的攻击无效判定,看见自己砍玩家B无反应;
服务器这时才收到玩家B提交的的一大堆新数据(包括玩家B的本地坐标),返回给玩家A;
玩家A看到玩家B突然瞬移到了另一个位置(玩家B的实际位置)。
不光是瞬移,当玩家A攻击玩家B到了一半,却发现自己被玩家B反攻;或者砍玩家B不掉血,玩家B砍自己却掉血,都是属于同样的原理。
在hub连接的局域网模式下,短时间拔掉网线并不会导致游戏立刻掉线。当遇到对方玩家时短时间拔掉网线再插回去,就可以看到对方瞬移了。
2. 带着冰冻效果到处跑
现象:玩家A看到玩家B身上带着冰冻效果移动
产生原因:信息传输过程中丢失了数据包。
分析:
玩家B被冰冻,服务器和玩家A、B均收到相关数据;
玩家B解冻,服务器将该数据发送给玩家A、B;
玩家B收到解冻指令,开始移动并提交给服务器;
服务器发送给玩家A的玩家B解冻数据包丢失;
服务器收到玩家B的移动指令,转发给玩家A;
玩家A收到B的移动指令,看到玩家B移动;
由于解冻数据包的丢失,玩家A看到B身上仍然带着冰块,并且该现象会一直持续到下一次玩家B的形象数据更新。
在网络传输中,丢失数据包是很正常的事情。如果对时间要求不高,可以采取丢包重发机制在保证数据包的安全性;但是对真三这样重视实时性的游戏来说,丢包重发显然是不可能的。
有时候看见玩家死亡后躺在地上移动、带着其他玉效果乱跑,都是属于同样的原理。只要对方离开自己视野范围后再接触,就正常了。
3. 追杀
现象:玩家A甲刀无双追杀玩家B,砍飞了却发现对方不掉血
产生原因:1.玩家B网速不稳定,主要是玩家B网络上行速度受限
2.玩家A网速不稳定,主要是玩家A网络下行速度受限
分析:
玩家A,B均朝同一方向移动。
玩家A甲刀放无双;
服务器收到玩家A的无双指令,传递给玩家B;
玩家B跳起并向服务器发送数据包;
服务器向玩家A转发玩家B的跳跃指令;
由于延迟,玩家A没有收到B的跳跃指令,因此撞上本地看到的玩家B,向服务器发送攻击指令。
服务器判定玩家B跳起,因此玩家A的无双攻击无效;
玩家A没有收到攻击无效指令,看到B发出惨叫并被割飞,但是不掉血;
玩家A收到B的跳跃指令、攻击无效指令、B的新位置指令。
于是玩家A看到的是:B被自己的无双割飞后不伤血,继续跑路。
由于延迟程度的不同,产生的后续现象也不同:
玩家A还可能看到:B发出惨叫,然后出现在空中(延迟程度较低);
B直接跳起来,躲开自己的无双(没有延迟);
B被撞飞并且躺地上,守着尸体却发现B突然消失(延迟非常高);
跑D撞到对方听到惨叫声,对方却在继续跑,也是属于这样的情况。
4. 其他。。
因为我暂时想不起来,所以等我想到了或者大家提到了,再进行更新。
如果大家有觉得其他的疑问也可以在回复里说明,是属于延迟引起的问题我也会在这里更新。