互联网延迟是什么意思(解析令人头痛的游戏延迟)

网络时延是所有后台程序员的挑战,特别是对于游戏开发来说,特别是FPS或MOBA游戏,有时候,延迟可能左右一次击杀,甚至一盘游戏的胜负。而网络延迟也常在程序员的面试题中出现:

  1. 网络延迟出现的原因是什么?

  2. 有哪些方法降低网络延迟?

是什么是延迟

首先我们要明白什么是网络延迟,网络延迟是你从客户端上发出一次操作,到收到服务器响应的一个延迟时间。举个例子:你在打王者荣耀,然后你决定不慌吃口药。很显然吃药能否恢复生命是由后台决定的,所以,你从吃药到开始回血可能是下面这样的过程:

令人头痛的游戏延迟,如何解决​

 

  1. 用户点击了回血,客户端向后台发起请求

  2. 针对用户的请求,会校验角色的状态(例如角色跪了肯定就不能再吃了),上次吃药的频率(1分钟才能吃1次)等业务逻辑

  3. 校验没问题之后,会下发消息给客户端说可以吃药了。

  4. 客户端收到消息之后,继续吃药的动画。

在用户发起请求,到用户收到服务端的确认请求之间的时间,我们称之为延迟。

延迟的产生

从用户的手机,到游戏后台的服务器,是有距离的。现在,光纤已经遍布大江南北,即便数据在光纤中的传播速度接近光的速度,从深圳到北京也是需要十来毫秒。事实上,从你的手机上操作,访问北京服务器的数据,并非是直线访问,需要经历过非常多中间设备,不同的运营商。在这些设备之间,可能性能参差不齐,造成延迟进一步加大。

其次,服务器处理数据,是需要时间的,如果代码写得不合理,或者服务器性能过载,都可能增加单个请求的处理时间,从而造成延迟加剧。

延迟优化

令人头痛的游戏延迟,如何解决​

 

第一个是从硬件上处理,建立专线。如果说原先的网络环境是普通的公路,那么,专线就是高速公路,在专线上,中间设备会减少,并且带宽更大,减少数据进行绕路。

第二个是从传输协议上,例如使用UDP协议替换TCP协议。越来越多的游戏传输协议,从TCP切换成UDP。由于TCP建立连接需要三次握手,并且TCP有队首阻塞问题。在网络不稳定的时候,更容易加大延迟。有人说,使用UDP协议,不就不可靠了么?在我们之前有一篇文章,专门介绍可靠的UDP协议传输,有兴趣可以看一下。

第三个还是从传输协议上优化,一般来说,为了优化的性能,在客户端或服务端,我们都会使用Buffer来进行数据缓冲,带来更高的IO效率。但是,如果Buffer过大,就可能是人为的制造延迟,所以我们可以减少Buffer的使用,或者缩小Buffer的大小。

第四是服务器使用更高的更高的帧率运算。什么是帧率呢?很多对战的游戏,并不是数据一发送到服务器,服务器就立马处理的。如果服务器1秒钟处理30次,那么,如果一个请求到服务器的时候,上一帧刚处理完,它就需要等待33ms。如果帧率提升到120帧,那么同样的情况,只需要等待8ms,大大减少延迟的时间。

第五客户端提前动画或预测数据,改善用户体验。还是上述那个吃口药的例子,我们在用户点击之后,就立马处理吃药的动画,因为绝大部分用户,都是正常的用户,发出来的请求都是合法的请求,对于少数外挂的用户,后续服务器返回进行对齐就可以了。这种方法,实际上并没有改善延迟,但是却大大提升了用户体验。

总结

我年轻时候,那个时候最受欢迎的FPS游戏是CS跟CF,那个时候我就有这样的一种感觉,如果我蹲在一个地方狙人,总是还没看到人就被对面一闪而过狙击手也打死了。

以前我一直是觉得自己的技术比别人差,后来,学习计算机,当我了解了延迟机制的时候,才真正明白其中的道理,对于伏地魔,对手移动的数据是延迟的,而移动的人,看伏地魔,就是一早就在那里的。加上那个时候大部分游戏都是30FPS,网络还是铜线宽带,所以,实际上移动的人多了大约小半秒的反应时间。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注