租号玩代理申请
A-A+

因英雄联盟卡而引发的关于游戏FPS问题的研究与探讨(二)

2020年11月22日 问题教程 暂无评论 阅读 95 次

本文是接因英雄联盟卡而引发的关于游戏FPS问题的研究与探讨(一)的继续和延伸阅读:

以下资料来自电脑报:

30fps够流畅吗?深入分析fps与游戏流畅度的关系

  在游戏中我们经常会遇到画面卡顿的现象,这通常是由于显卡性能不够强造成的,比如显卡在游戏流畅度的测试中达不到30fps以上的帧速,当然我们会感觉到游戏画面卡顿。但是,有时候我们也发现游戏帧速明明已经超过了30fps,但游戏画面依然会出现不定时的卡顿,这是什么原因造成的呢?下面我们就来研究一下。
平均30fps未必流畅
  通常我们认为平均帧速达到30fps,游戏就流畅了,那么在实际操作中,事实是否如此呢?下面我们就通过GeForce GTX 660Ti和Radeon HD 7970两款显卡在《天堂2.5》和《战地3》这两款测试软件中的表现来验证。

 从基本的最高帧速、最低帧速和平均帧速的记录我们就能够粗略地看到,两款显卡在《战地3》中是流畅的,而在《天堂2.5》中并不完全流畅。虽然两款显卡在《天堂2.5》中的平均帧速都在30fps左右,但最低帧速仅17fps,远谈不上流畅,平均帧速其实是被最高67fps/82fps的帧速拉高的。

《天堂2.5》中GeForce GTX 660Ti的帧速变化曲线

《战地3》中GeForce GTX 660Ti的帧速变化曲线

《天堂2.5》中Radeon HD 7970的帧速变化曲线

战地3》中Radeon HD 7970的帧速变化曲线

每帧渲染时长低于1/24秒才流畅
  前一部分我们从帧速的角度讲到这两款显卡在《战地3》中是流畅的,而在《天堂2.5》中并不完全流畅。但在实际测试中我们还是会感到在《战地3》中,游戏会偶尔出现卡顿,下面我们就从每帧渲染时长的角度来看看这两款显卡在《战地3》中是否流畅。

《战地3》中GeForce GTX 660Ti的每帧渲染时长变化曲线

《战地3》中Radeon HD 7970的每帧渲染时长变化曲线

  从两款显卡在《战地3》中的每帧渲染时长变化曲线可以看到,虽然绝大部分画面的渲染时间都小于33.3毫秒,但GeForce GTX 660Ti在《战地3》中有一处的单帧渲染时间明显超过41.7毫秒,有三处的渲染时间明显超过33.3毫秒,而Radeon HD 7970在《战地3》中有一处的单帧渲染时间明显超过41.7毫秒,有两处的渲染时间明显超过33.3毫秒。这就是我们在游戏中会感觉到画面卡顿的原因,因为在卡顿最明显的两处,前一帧画面出现后,要间隔48毫秒才会出现下一帧画面。这就是两款显卡虽然在《战地3》中的平均帧速都超过64fps,但我们依然能够感觉到画面有卡顿的原因。

总结
平均帧速+最高每帧渲染时长综合判断才够精确

  结论很明显,想准确描述游戏的流畅度还是要记录游戏中每一帧画面渲染的时间,而这对于游戏时间较长的测试来说还是相当麻烦的。
  不过我们也可以看到,平均游戏帧速越高,实际上每帧画面渲染的时间总的来说还是趋短的,所以通过平均帧速还是可以大致说明游戏流畅度的,虽然不够精确。

名词解释:视觉暂留
  当人眼所看到的快速运动的影像变化后,人眼仍能继续保留其影像0.1~0.4秒左右,这种残留的视觉则被称为“视觉暂留”。由于视神经的反应时间约为1/24秒,因此电影视频达到24帧每秒,我们就不会感觉到卡顿。

Q&A:同样是24fps,为什么游戏感觉卡而电影不卡?
  这个问题,实际上要从电影的拍摄和播放原理来说,由于人们发现视觉暂留的时间为1/24秒,因此在拍摄和播放正常速度的镜头时(慢镜头和快速镜头不算),电影胶片就是以24格每秒的速度在走,每一幅画面出现1/24秒之后就一定会有一幅新画面出现,且每个画面本身就带有“动态模糊”,而不是静止图像,通过这个过程人们就能看到连续的电影。而游戏画面是由显卡进行实时运算渲染出来的,显卡的性能和游戏每帧画面的复杂程度的不同决定了没法保证每两帧画面能够以同样的时间间隔(1/24秒)出现,而且每帧画面都是静止图像,一旦有卡顿就能明显感觉到。

延伸阅读:GeForce GTX680的主动式垂直同步技术
  游戏帧速与游戏流畅度的关系还受到垂直同步技术的影响。
  在传统的垂直同步设定中,帧速会被划分成30fps和60fps两档,当游戏帧数在这两个值之间跳变时,巨大的帧数落差就会带来明显的卡顿,和画面撕裂。
  NVIDIA在GTX680中引入的主动式垂直同步技术(Adaptive VSync)最大的意义就是改变传统垂直同步分段式的帧数管理模式,用更加平滑的帧数曲线来最大限度地避免游戏卡顿和画面撕裂的情况发生。

二、CPU、显卡对游戏FPS的影响;

由于文章篇幅比较大,请直接阅读原文:
帧数不只靠显卡 实测游戏对CPU依赖性

三、网络延时对网游fps的影响;

FPS游戏原理漫谈:玩家延时与服务器同步
  易竞技前言:在知乎上有玩家提问“在FPS游戏中玩家延时都不一样的情况下是怎样做到游戏的同步?”知乎网友“周恺华”对此给出较为充实的回答,有兴趣了解这方面知识的玩家可以通过下面的回答来一窥究竟。

知乎网友“周恺华”的回复:

  声明:下面会大量使用CSGO作为例子,因为Valve在多人游戏的网络通信方面做得较好,可以当做一个典型来分析。

多人竞技游戏中客户端和服务器的互动

  游戏中所有的逻辑判定都是由服务器完成的,客户端只负责发送请求和接收服务器的反馈,并把反馈具象化。拿CSGO做例子,玩家A拿着AK瞄准了玩家B的头开了一枪,那么玩家A的客户端会向服务器发送一个数据包,里面包含了谁(玩家A)拿着什么武器(AK)从什么位置(玩家A在地图上的坐标)向什么方向(角度)开了一枪。服务器收到后进行判定,这一枪的伤害会经过玩家B的头部模型,判定为爆头伤害,数值为XX,判定玩家B死亡。服务器再向所有玩家的客户端通信,更新当前游戏状态,其中包括玩家A用AK爆头击杀了玩家B,也会包括其他信息,比如玩家们的位置等等。玩家A收到通信后显示击杀了玩家B,玩家B则会收到被击杀的信息。

  接着讲一个概念,叫服务器的通信频率(tick rate)。事实上服务器不是百分百实时地向玩家通信来更新游戏状态的,那样需要的计算量很大,同时对网络带宽的要求也会高的不现实,因此服务器会以一定的频率来进行通信。

  CSGO在娱乐模式下通常采用60Hz的频率,也就是说每过1/60秒玩家的客户端就会收到一次新的信息。如果回到上面那个例子,那么实际情况应该是:玩家A拿着AK瞄准玩家B的头开一枪,你的客户端会向服务器发送一个数据包,服务器接收后进行判定。判定完成后等待至下一次通信,再向所有玩家更新游戏状态。也就是说游戏过程其实是一个离散的过程而非连续过程。

如果玩家的Ping很大,服务器会怎么办?

  上面的例子都假设客户端和服务器之间的延迟无穷小,那么当玩家Ping很大的时候会发生什么的呢?

  假设玩家A与服务器之间存在100ms的延迟(单向,往返则是200ms),其他玩家的延迟忽略不计,服务器的通信频率足够大(频率不够大还会造成其他很严重的问题,这个放在后面讲)。玩家A在某一刻向服务器发送了一个请求(比如向前走),那么这个请求会在100ms之后到达服务器,服务器判定后返回结果,再经过100ms你的客户端会收到确认,服务器已经把你的位置向前移动了若干距离。假设客户端在没有收到任何服务器的更新前画面都不会变化,那么在这200ms内你就会觉得游戏“卡顿”。

  实际上很多游戏里中你会在这200ms里看到你自己是在向前走,其实那只是客户端“擅自”在绘制你前进的样子,这是一种延迟补偿策略,称为“客户端预测法”。即客户端能够大致预测游戏未来的走向,因此在接收到服务器更新前会把预测到的画面先绘制出来(比如移动、武器的开火效果、弹药计数的变化等)。客户端收到服务器通信后如果数据有出入则立刻纠正为服务器提供的数据。因此在延迟很大的时候玩家会发现“明明往前走了过了一会又瞬移回到之前的位置”的原因,或者是“明明开了好几枪而且也都显示了但过了一会弹药计数只减少了一点点”。

  既然扯到这里了那就认真的讲下延迟补偿策略(lag compensation),一般来讲补偿策略分服务器端和客户端两类,上面提到的预测法属于客户端一类,其他的客户端策略还有插帧法。所谓插帧法就是客户端会记录之前一次从服务器收到的信息,然后在接受到下一次通信的时候不立刻更新游戏画面,而是逐渐的更新画面(比如两次通信间玩家B移动了10单位距离,客户端会绘制玩家B以一定的速度移动了这10单位距离,而非立刻绘制玩家B瞬间移动了10单位距离)。插帧法的问题在于如果玩家并未沿直线运动且其直线路径中有本应不能通过的物体存在时(比如绕过一堵墙),客户端会绘制出该玩家穿墙而非绕过去的动作。

服务器端处理延时同步常用的策略

  1.“眼不见为净”法,服务器不去补偿玩家的延迟是一个合理的做法,特别是当游戏内进行的事件非常多(想想《行星边际2》里面千人同图混战的情形)。浪费宝贵的服务器资源去补偿个别玩家的延迟是不明智的。这个策略的缺点很明显,就是玩家有可能会对游戏体验不满意。

  2.“倒带”法,采用倒带法的服务器会记录刚刚过去一段时间内(比如0.5秒)游戏内的所有信息。当一个有延迟的玩家(比如200ms)向服务器发送一个请求,那么服务器在处理这个请求的时候会调取0.2秒前游戏的状态然后进行判定,在把判定结果对所有客户端进行同步,如此一来该玩家的操作虽然有延迟但也能与他/她所看见的画面一致。该策略的最大问题在于它让不同延迟之间的玩家被迫体验较大的延迟。举个例子,假设游戏里击杀时间(TTK)足够小,玩家A(10ms延迟)和玩家B(延迟200ms)对射,两人都是空血(一次攻击即死),A比B先开火(时间差很小,比如50ms)。玩家A的次攻击很快(10ms后)就得到了处理并记录在服务器中,玩家B被判死亡。然而在200ms后玩家B的请求到达,服务器倒带0.2秒,此时玩家AB都未死亡,因此玩家B的攻击有效,玩家A也被判定为死亡。如果没有延迟,那么服务器应该会判定玩家B死亡,因此玩家B将无法攻击,玩家A应该存活。换句话说采用倒带法的服务器里如果有一个延迟很大的玩家将会拖累其他低延迟玩家的游戏体验。

以BF4为例,低通信频率会带来的灾难

  前面的例子都是以服务器的通信频率足够高为前提的,下面简要描述一下低通信频率带来的问题。这里我要举的例子是大名鼎鼎的《战地4》(下称BF4)。

  BF4在刚刚发布的时候可谓是Bug满天飞整一个就是半成品,其中非常严重的就是网络通信问题(netcode issue)。根据制作组DICE提供的信息,BF4的通信频率是10Hz。这是一个相当低的设定了,大多数FPS的通信频率在30Hz左右,而CSGO为60Hz,电子竞技比赛时一般服务器的通信频率还会提高到120Hz(因为比赛时大家都是在一个局域网里所以延迟很小高频通信能够更加精确反映游戏内状态)。由此带来什么糟糕的后果呢?

易竞技配图:销量很高但是口碑争议的BF4

  1.游戏体验的不连贯。BF4的客户端,和其它很多游戏一样有应用客户端预测法来补偿延迟。但是因为服务器更新的频率是在太慢了(0.1秒才更新一次,人类的反应时间差不多略小于0.1秒,即玩家已经可以感觉到其中的不连贯)。拿移动来举例吧,玩家正常的前进,突然玩家的延迟很短暂的增加了一下然后又回到正常,那么其中某一次移动的请求就会花更多的时间到达服务器。客户端这边因为没有收到服务器的通信而绘制了玩家前进的样子,0.1秒后服务器告知客户端实际的位移小于绘制的距离,客户端进行纠正(瞬间向后退),而0.1秒可以前进很大一段距离了(至少肉眼可以感觉出来有变化),如此瞬移回退让玩家感觉非常不舒服,即使延迟很小只要有变化就有可能发生这种情况。同样的情况适用于玩家看到的其他玩家所在的位置。在服务器中敌人的位置往往比客户端上显示的要滞后,因此很多时候明明瞄准了却打不中。相对的,如果提高通信频率,客户端“擅自”绘制的画面和服务器数据能够以更高的频率进行纠正,其中每次产生的变化都不会让玩家察觉。

  2.“瞬间”击杀(Instant Kill)。BF4里的自动武器射速绝大多数都超过了600RPM(即每0.1秒一发),高射速武器如AEK971可以达到900RPM甚至更高,而大多数武器在近距离内都是造成25伤害(玩家满血100)。因此玩家A完全可以在0.1秒内发射至少2发子弹,在近距离内击杀生命值小于等于50的玩家B(这个边界值随射速提高而提高,如AKE971可以在0.1秒于近距离击杀生命小于等于75的玩家)。假设玩家A开始射击的一瞬间服务器刚好进行了一次对客户端的通信,玩家A在之后的两次发送射击请求都被服务器接收并判定(玩家B死亡),而一直到玩家A开火后的0.1秒内玩家B都没有接收到任何被攻击的信息。0.1秒后玩家B死亡,但玩家B的客户端只能绘制一次玩家A开火(虽然收到两次开火的信息),简单来说玩家B完全没有还手或者躲藏的机会,因为玩家B一直都认为自己没有受到攻击,只是在一瞬间就被A打死。对玩家A来说整个过程没有任何问题,而玩家B则是个冤大头。因此BF4已经失去了竞技的平衡性。

  在BF4发布八个月后(没错,八个月,期间发布了数款BF4的DLC),发行商EA(果然不要脸)终于决定要修复这些问题。一开始他们决定吧BF4的服务器端通信频率提高到30Hz,但是BF4是一款复杂度远远超过其他FPS游戏的一款作品,30Hz的通信频率就已经让很多玩家的电脑吃不消了。后来采取了一个折中策略,玩家附近的游戏状态以30Hz的频率进行更新,而距离玩家较远的信息继续以10Hz的频率来更新。同时还提供一个选项允许客户端以更高的频率向服务器“索要”数据(当然其中造成的硬件负担不可小觑)。目前BF4的网络通信已经恢复到“可玩”的状态。根据某些资深玩家推测,BF4的服务器无法以超过30Hz的频率进行通信,主要原因是其引擎寒霜3内核有缺陷。因此BF4不太可能成为一款竞技游戏走向电竞舞台。

-----------------------------------------------------------------------

  以上文章,均为转载,文章都比较长,建议仔细阅读几遍来消化他们,以下是我的一些思考:玩家说游戏卡,应该份为两种大的现象,根据现象判断解决方向:

1、fps不稳定的,100%是内因;
  根据几篇文章的分析来看,fps不稳定核心原因一定是在本地,因为原理已经明确的提到,只有每一帧播放的时间间距都≤16.67毫秒或33毫秒时,我们的眼睛才真正的能看到连续,流畅的画面!
  我们也可以反过来思考,现在液晶显示器最大刷新率就是60Hz,等同于60FPS,显示器可以1秒刷新60副画面,而画面是从显卡那里来的,显卡只要可以每秒可以产生60副画面,并且每副画面以16.67毫秒~33毫秒的稳定间隔时间传递到显示器,就可以了!
  而显卡的整个绘图过程,除了显卡自身工作,实际上CPU也起到了非常大的作用,因为新的CPU也有渲染相关的功能,同时,CPU还要负责整个PC的硬件资源分配和调度,这就又涉及到内存速度、硬盘/存储的读写速度,任何一环出现问题,都可能会导致显卡输出画面不稳定,所以如果问题现象是fps不稳定,那就不用去理会外网问题,直接查自己网吧内部环境就行了!即至少包含但不限于以下因素:
机器配置低;
硬盘读写速度慢或者不稳定,如果是无盘就可能是无盘性能、服务器游戏盘、镜像盘、回写盘、服务器网卡本身、网卡驱动、网卡参数设置、交换机一系列的因素;
内存不够用;
cpu不够用;
显卡不够用;
显卡驱动问题;
硬件本身性能ok,但系统上有软件导致不定时的cpu(如数据采集)、内存(如内存溢出)、硬盘(如持续回写)、显卡资源消耗(如GPU挖矿);
当然,也包含不靠谱的游戏官方客户端有问题……

2、fps一直都是比较稳定的,99%是网络或官方服务器因素,1%是网吧内部问题又或是网络或服务器因素;
  fps稳定还卡?当然会,你不要忘记,顾客所说的卡是,只要他在游戏里发出指令,没有在0.5秒以内给出正确的回应,他就会说卡,卡并不一定只是画面不动,他还包括但不限于以下现象:
进行移动时,鼠标点击人物往前跑了10步,结果突然倒退了5步,在过去的热血传奇中,这种现象很常见,典型的外网问题;
进行攻击时,打人打不死,按照玩家的经验,明明应该可以爆头的,但经常不能爆头,例如cf就是典型的例子;
而以上两种现象就是99%的可能性,在技术员的口里,往往叫做延时……延时最明显的特征就是客户机和游戏官方服务器之间的ping值高(》50毫秒)
还有1%是什么?准确的描述是:掉帧。就是从a画面直接跳跃到b画面,中间可能省略了人物移动、画面特效等。但这种情况要划分外因还是内因又要去看,掉帧的时候,游戏的数据是否比较正确,如果正确,则是网络方面的外因可能性大;反之则是内部问题可能性大!

  所以啊所以,大家反馈问题的时候,自己一定要在掌握一些原理的情况下,再去观察现象,求助时可千万别只说,游戏卡了……游戏卡的可能性太多啦,你这么问,难道希望看到几万字的解决方案,然后自己挨个去试验吗?就算你愿意,有谁愿意去写几万字的解决方案呢?
  说难听点,我们是技术员,难道要像顾客那样,用小白式的提问方法吗?
  好啦,接下来拍砖时间到,想吹牛逼的,想显摆的同学,接下来就是你们的时间啦!

京东空调大促销