为何电影只需24帧,而游戏画面FPS(Frame Per Second)帧率(Frame Rate)却要60?
大家玩游戏这么多年,或许都会有那么几个疑问云牵梦绕:为什么2D像素化的古董超级马里不卡,但3D游戏确卡了?为什么电影每秒24帧不觉卡?但游戏没30帧就得卡成汪星人?虽然网上有各种各样的回答,但很多都不尽科学不够全面,所以笔者还是来全面科普一下吧。
生理基础
所有的故事都要从人类肉眼的“视觉暂留”和“脑补”现象说起,前者是指人类视网膜在光信号消失后,残像还会保留一定时间的现象;后者是大脑自行补足画面中间帧的“脑补”功能。它们的混合作用,让我们误以为每秒24帧回放的照片是“连续”的。
而至于为什么要把数字定在24,这里面更多是约定俗成和玄学,电影规格本身也经历了16到24帧的转变,这个数字以后估计也会继续增长。而PAL/NTSC/SECAM三种电视信号规格,把帧数定在每秒25帧和30帧的原因,其实只是因为不同地区的供电频率不同(50Hz和60Hz)……为了方便计算,采用NTSC制式的美国和日本,在游戏中很自然地了沿用了每秒30帧的习惯(NTSC制式为29.97帧)。
但为什么看24帧的电影毫无违和感,但30帧,甚至60帧的游戏中也会出现卡顿?这里直接说结论,决定游戏流畅度有4个:动态模糊效果、操作响应、帧率和帧率均匀度,当中以动态模糊最为重要。
动态模糊
动态模糊,是指相机快门慢于物体运动而导致的运动轨迹拖影。3D游戏和电影的重要差别:电影是现实光影的记录,而3D游戏是3D模型形状/位置的实时渲染,前者会有动态模糊,而后者不会。
电影是恒定频率的拍摄的胶卷/数码照片,它可以完整记录一段时间内的光线信息。一般24帧每秒的视频会选取高一倍的1/50秒的快门,可以完整记录半秒的光线信息。而这些“多出来”的丰富图像信息,会像重影一样叠在一起而造成动态模糊/拖影,其原理和“光绘”一样,只是快门不是几秒,而是1/50秒。
在人类大脑中,动态模糊是视觉信息量的一个重要表现,即使实际看到的帧数不够,加入动态模糊的间隔画面也足够我们用来进行脑补,从而实现“流畅”。另外,偏题一下,如果同样的每秒24帧,如果快门速度提高到1/96秒,那胶卷中记录的光线信息只有1/4秒(24*1/96),丢失的光线信息会让模糊效果减弱,这样的电影看起来也是会有卡顿感的。
而游戏则是把这个“快门速度”提升到极致的产物,游戏中的30帧,是游戏引擎生成的30个无限短的瞬间画面,而且这些瞬间无论多快,物体本身都是清晰无比,绝壁不会有模糊效果。如果这时候还以24帧每秒播放,大脑会抗议,这货动得这么快,为什么我还看得那么清楚,完全不科学啊,结果“脑补流畅度画面”过程就无法进行,我们就真的在看播幻灯片了。
要解决这个问题,要不提高取样率,要不就人为增加模糊效果。前者是下面会说到的高帧率方案,而后者就是增加模糊效果欺骗大脑,让它以为自己看到是高信息量的画面(然而模糊效果也很耗资源)。
帧率大小
游戏中的物体如果每秒移动1个像素点,我们或许还能觉得流畅,但如果物体每秒移动10个像素点,那就有明显段落感了。这时候需要提高取样率,把中间缺掉的画面补出来,如果帧数提高到每秒10帧,我们就可以看到接近刚才1秒1个像素点的流畅度了。
通过把每秒24帧的画面,提升到每秒48、甚至60帧,双眼接收到的信息量大到一定程度,就足够用来“脑补”出流畅效果了。虽然最完美的游戏应该是要帧数尽可能地多,那样才是真正模拟现实情况,但对于游戏来说,渲染帧数越多,需要的性能就越高,这个方案的代价太大了。而现在大家公认的是,做到30帧就能完成脑补过程了。
帧率均匀度
然而实际游戏中,30帧照样会时有卡顿,甚至提升到60帧也还是会卡。平时我们撸手机评测的时候,经常两部不同GPU的手机,就算显示的FPS(每秒的帧数)相同,照样也是会有流畅度差异,这是为什么呢?
这里的问题出在了“帧”的精确上。即使之前时间都能30帧以上渲染,但只要有那么几个瞬间跌破30帧,那依旧是卡。理想情况下的30帧每秒,是30帧均匀分布,但实际上有可能前半秒渲染29帧,最后的整整半秒只渲染了1帧。
因为运算能力和画面复杂度的限制(例如从平原中突然有巨大爆炸的画面),前半秒渲染压力小,可以满帧跑。但一到爆炸场景,运算量暴增,来不及渲染,后面帧数就下降了。肉眼虽然对帧数的绝对值不敏感,但明显的帧数变化还是能轻易地察觉的。
很明显平时我们看的FPS(每秒帧数)的精度完全不够用,我们需要把精度,从每秒多少帧,提升到每毫秒多少帧才能精确衡量帧率的稳定性。 一帧多少毫秒? 答1000除于FPS。
响应时间与跟手度
游戏和电影的最大区别是,游戏是需要用户做出动作并对动作进行实时反馈的。除了视觉流畅,我们还需要操作流畅。大家追求60帧高帧率的重要原因,为的就是降低响应时间。我们感知一个动作是否完成,是要机器接受操作信息,并最终反映在下一帧中才算完成。而实际操作中,大多数游戏引擎在接受操作指令后,要3帧间隔才能体现在画面上。
帧数刷新速度越高,我们能感知的操作速度就越快。30帧的游戏,即使忽略操作指令传输速度,每个画面持续33毫秒(1s/30=0.033s),一个操作需要100毫秒(33毫秒*3帧)才能反映在画面上,而60帧的游戏,则只需要50毫秒就能响应过来了。这50毫秒,在游戏中很有可能决定你是爆别人头,还是被人爆头了。
另外,如果出现画面压力太大,机器来不及渲染画面,画面出现掉帧甚至卡顿,我们的操作指令也是会被顺延输入的。效果就是我们几秒前的做的操作,在几秒后才逐一显示在画面上,这就是传说中的卡成翔了……