偶然在知乎看到有人问:“为什么认为游戏帧数要到 60 帧每秒才流畅,而大部分电影帧数只有 24 帧每秒?”
觉得自己有必要回答一下问题,发表在知乎上,Copy到这里。
原链接:http://www.zhihu.com/question/21081976/answer/75357913
在我看来,题主的这个问题其实包含了若干个小问题,这若干个小问题又引出一些其它的问题,我们一个个来看:
1、“为什么大部分电影只有24帧每秒?”
2、引发的问题(个人认为):“24帧每秒真的流畅吗?”
3、进而引发的问题:“如何解决观看视频时不流畅?”
4、”为什么认为游戏帧数要到 60 帧每秒才流畅?“
5、引发的问题:“如何解决或缓解游戏达不到60帧时不流畅的感觉”
注意:
1、由于视频与游戏不太一样,“视频输出与显示设备不同步”与“游戏输出与显示器不同步”不同,请注意。
2、我们需要了解一点:由于人眼的适应性,观看等时输出的画面时会觉得流畅。而非等时输出的画面会明显感知。
下面我们来一一回答:
1、“为什么大部分电影只有24帧每秒?”
答:略,这个问题看其它答案吧,回答好的比比皆是,我就不再班门弄斧了。(滑稽)
2、引发的问题(个人认为):“24帧每秒真的流畅吗?”
答:其实电影24帧每秒是否流畅都要看设备。归根到底就是“视频输出与显示器不同步”,现在说下原理。
电影24帧历史由来已久,但发展到现阶段是最适合现代人的视觉感官的吗?个人的答案是——NO
首先我们先讲到人们日常观看电影(或视频)的两种方式:电视和显示器。
电视标准为两个:NTSC(29.97帧)和PAL(25帧),而大部分电视都支持24帧、25帧、30帧(24p、25p、30p),也就是说,观看电影时,视频文件每帧和电视每帧同步,每帧与每帧之间的输出间隔相同,由于等时效应,人眼感觉流畅。
而显示器大多支持50Hz、59Hz,60Hz这之中就有问题,其中默认都是60Hz。
当观看30p的视频文件时,显示器(60Hz)每刷新2次会输出视频文件的1帧,同步(2倍关系)
当观看25p的视频文件时,显示器(更改为50Hz)每刷新2次会输出视频文件的1帧,同步(2倍关系)
但是,当观看24p的视频文件时,却怎样才能同步?无论50Hz,59Hz,60Hz都不是其整数倍关系
这时显示器是如何工作的呢?
60/24=2.5,显示器要么刷新2次输出(视频文件的一帧),要么刷新3次输出(视频文件的一帧),不会出现刷新2.5次的情况
看似很合理,但我们分析一下其中的时间间隔
等时输出24帧画面需要的时间:1000ms/24=41.666……ms(24p视频文件)
显示器器实际的刷新时间:1000ms/60=16.666……ms(60Hz显示器)
于是就造成了以下结果:
当显示器刷新2次输出视频文件的1帧的时候,也就是显示器16.666……ms*2=33.333……ms
小于41.666……ms
当显示其刷新3次输出视频文件的1帧的时候,也就是显示器16.666……ms*3=49.999……ms
大于41.666……ms
所以当显示器输出24p视频文件的时候,是这样输出的:
前一帧和后一帧都不是等时输出,如此循环反复,人眼感官上肯定是不流畅的,更细致地说,画面输出间隔一会儿快一会慢,那种感觉与其说是卡顿,倒不如说是抖动感觉更合适。
所以,说到这里,有的人有没有发觉在电视上观看电影或视频时比显示器要流畅?
(但这种对比实际操作起来并不容易,因为如果将电视接在显卡上,你还是要设置刷新率的,这不就和显示器一样了吗)
现实的情况上比这更复杂,有的电视本身就提供了用于硬件补帧的电路,关于硬件补帧,后面讲到。
3、“如何解决观看视频时不流畅?”
要解决由于“视频输出与显示器不同步”引发的抖动问题,目前有以下几种方案:
①原生支持,显示器直接支持常用视频格式的输出帧率,比如24帧每秒的视频,就直接设为24Hz,效果最好。除了需要显示器支持,几乎不存在缺点。
②插帧,通过算法计算上下两帧画面中间的画面,插在两帧中间并按上中下的顺序输出出来。效果非常好。因为直接输出60帧每秒,所以每帧的间隔时间比原生24帧每秒更短,感官上甚至比上一种方案更流畅。但也存在缺点,暂停时可能会定格在这种中间帧上,并不是精确地实际画面,类似其他答友提到的动态模糊,所以需要截图时最好关闭。
如下图:
插帧分为两种:
软件插帧:使用通用集成电路(CPU)也就是软件来实现插帧,相关的计算任务由软件本身的算法定义,交由CPU来实现。相关软件:SVP,全称SmoothVideoProject,效果不错,缺点就是需要占用一定的CPU,具体占用情况视视频情况而定。低端CPU不建议使用。
硬件插帧:使用专用硬件集成电路实现的插帧技术,软件只进行调用,实际的计算交由硬件负责。所以CPU占用低到忽略不计。相关软件:Bluesky Frame Rate Converte,相关硬件:AMD独立显卡和AMD的CPU中的核显,两者都需要GCN架构以上。新版本中也可使用Intel Haswell架构以上的核显。目前作为本人的日常使用选项。
③这是madvr提供的一种方式,smooth motion,这一种是配合显示器的刷新率,优化视频画面输出的顺序,具体并不太了解,有人说有用,但是个人使用后感觉并没有多大的改善效果。
④potplayer播放器提供的倍帧,以前版本叫动态补偿,就是输出重复帧,与插帧不同,不计算中间帧,单纯将24帧的画面重复成48帧的画面,然后再输出到60Hz的显示器上,由于帧数翻倍,每帧的输出时间都会比较低,造成的抖动效果更少,实际效果虽然比不上插帧来的显著,但也比较不错,曾在一段时间内作为本人的日常使用选项。题外话:在win10上打开倍帧会更流畅,不知是不是新版本WDDM的原因。
4、”为什么认为游戏帧数要到 60 帧每秒才流畅?“
要剖析这个问题,就要不得不提到两个概念:每秒帧数和帧延时。
对于FPS(Frames per Second),即每秒帧数,通常每秒输出24张画面以上,根据人眼的视觉暂留现象,就被认为是连续的,但是不可忽视的是,这是一个统计学概念,只能描述宏观行为。
而针对游戏的卡顿情况,从微观上观察才是合理的,于是就有人提出了帧延时的概念。
帧延时,或者说Micro-stuttering。简而言之就是帧生成时间,可以理解为两帧输出的间隔时间。
如果你阅读并理解了上面的内容,那这里也就好理解了,游戏比视频更复杂,渲染量也更加不均衡,由于渲染量忽高忽低,在显卡运算上不可控制,每帧渲染耗时也不尽相同,在一秒之内如果有59帧渲染量都很小,每帧的耗时也很低,但是就有那么一帧相当复杂,渲染量很高,导致耗时很高,FPS就不能表现出来,如下图(图片取自网络):
可以看到突然有一帧的耗时相当长,达到了58ms,这表示什么呢?
显示器在刷新显示出A这一帧后,要等待58ms才能刷新显示B,而人的视觉系统善于捕捉不规律场景,那这一段延时就会被明显感知。
而在游戏场景中,这种问题相当常见:(图片取自网络)
可以看出N卡相对A卡更平缓一些,但也只是缓解问题。
所以,实际上设成50Hz也行,只要显卡均匀输出每个画面,间隔时间一样长,就像播放每秒50帧的视频文件,也是不会出现卡顿的。人眼也就感觉流畅。
可以猜测,针对游戏的驱动优化就是分析出现这些延时帧较高的特定场景,进而对这些场景分析并优化,解决短板效应带来的影响,平均FPS和最低FPS就会显得好看。
所以,为什么会有60FPS流畅的说法呢?
个人认为有两个原因,
第一个原因:60FPS代表性能段,如果一款游戏平均帧率高于60FPS,那么出现帧延时的现象的频率更低。
第二个原因:因为显示器刷新率为60Hz,与60帧每秒对应,理论上同步,如果低于60帧,则还会出现渲染-刷新延迟问题(以下讲到)。
当然还有一个不算原因的原因:历史的原因,如果从CRT显示器时代就是默认50Hz,那么现在的说法也就会变成“为什么游戏帧数一般要到 50 帧每秒才流畅”这个说法。
5、“如何解决或缓解游戏达不到60帧时不流畅的感觉”
我们先来讲一下垂直同步技术,垂直同步解决的问题其实是画面撕裂(只讲每秒帧数达不到60帧的情况)
玩游戏时显卡的工作可不像视频输出那么有规律,每一帧的处理、渲染时间都不尽相同,而显示器很规律,每1000/60=16.666……ms就向显卡要一次画面。就像饭店,服务员每隔一段时间向后厨要客人点的饭,后厨说:忙不过来了,你先把这半碗饭端过去吧……半碗……半碗……
转到显示器上,就是完整的画面渲染不过来了,只渲染了一半的画面,由于液晶显示器的工作状态:你显卡不给我信号,那我就刷新显示前一帧的画面,可是你只给了半个画面(半碗饭),那我就把你给的这半个画面和上一帧的另一半画面一块显示出来,于是玩家看到了画面撕裂。(为了便于理解这样讲解)
怎么解决呢?开启垂直同步,强制每秒输出60帧,理论上讲你显卡输出超过60帧每秒,显示器也显示不过来啊(当每秒帧数超过刷新率时,显示器依旧每秒只输出60次画面,于是多出来的画面就丢弃了,这称为丢帧或掉帧)。
也就是说,强制后厨做完整碗饭再端上来,特么的有你这样给客人上半碗饭的么?
这样看似完美了,但是问题又来了,前面说到,玩游戏时显卡的工作不那么有规律,每一帧的处理、渲染时间都不尽相同,突然这一帧工作量超大,渲染时间超过了16.66……ms,于是不输出,再过16.66ms的时候输出给显示器,于是这一帧的渲染时间就变成了33.333……ms,1000/33.333……=30,即到达了每秒输出30帧的标准, 这种突然的输出延时,造成了人眼的卡顿。
翻译过来就是,后厨忙不过来,但是又不允许只盛半碗饭,那服务员你下次再来吧,客人这段时间就只能饿着了。
怎么办,怎么办?
造成这个原因最根本的是什么?
就是“游戏输出与显示器不同步”啊,要是能同步,还有你垂直同步什么事?
根据上面说的面垂直同步解决的是撕裂,但是又带来了渲染延迟的问题,针对延迟渲染的问题,下面我再解释一下:
假设不考虑画面撕裂,只考虑渲染量不均,当显卡渲染能力到达不了60帧每秒的情况时是这样的:
游戏画面第一帧渲染量很小,在显示器要刷新第一次的时候就渲染完成了,于是显示器刷新第一次的时候画面就显示出来了。
然后突然渲染量突然变大,显卡耗时很长,这一帧刚好在显示器刷新完第2次时渲染出来,(此时由于显示器由于没有接受到新的画面,刷新再显示一次上一帧画面),这一帧画面就只能在显示器刷新第3次的时候显示出来,白白浪费16.666……ms的时间(注),于是乎玩家看到实际输出是这个样子:
实际的两帧画面间隔时间是16.666ms+16.666ms=33.333ms,这种延迟就造成了人眼的卡顿。
于是AMD的Freesync和NVIDIA的G-sync应运而生。(需要显示器支持)。
这项技术的初衷就是要解决打开垂直同步后,显卡输出达不到60帧每秒出现的渲染-刷新延迟,和关闭垂直同步后,出现的画面撕裂问题。
两者的原理大致相同,强制显卡渲染完一帧再输出,什么时候渲染完什么时候输出给显示器,显示器不再是隔一段时间来取一次。解决了“游戏输出与显示器不同步”的问题,同时渲染-刷新延迟问题不存在了,所以感觉会流畅一些。这样有点类似上面的播放视频时讲到的直接调节显示器刷新率,以达到流畅。但是有一点不可忽视,视频画面是均匀输出的,而游戏画面是不均匀输出的,人眼对于规律的画面适应性更强,但对于不均匀输出的画面适应性偏弱,所以在使用了这两种技术后,有人觉得流畅,但有人却觉得依旧卡顿。毕竟说到底这也只是小部分场景,没有从根本上解决帧渲染时间不相等的问题。
在游戏卡顿的道路上任重而道远啊。
不妨脑洞一下,既然AMD有硬件插帧技术,能不能将本来帧数偏低的画面通过硬件插帧补偿一下呢,因为硬件插帧是额外的电路,对游戏性能不造成影响。(针对视频渲染与游戏渲染的画面输出方式其实是不同的,做一个转换电路。)不用补帧到每秒60帧的程度,就是比如需要48ms才渲染完成,在这中间24ms的时候插入一帧,传统的中间帧是需要由上下两帧计算出来,那么改下算法,根据上两帧的画面计算这一帧的画面,然后再下一帧是真正渲染出来的画面,这样也可以回避传统的动态模糊造成的额外显卡运算。
哈哈哈,这不扯淡吗。。。哈哈哈,显卡怎么可能知道每一帧需要的渲染时间2333……
说点靠谱点的,游戏开发时与显卡厂商更深一步的合作,提前预判渲染量大的画面,然后提前渲染画面,也就是将垂直同步中的双重、三重缓冲拿到Freesync和G-sync上来。