做过显示性能优化的同学应该常常听到别人说显示性能优化的目标就是达到 60 fps, 但是至于为什么是 60 fps 而不是 55 fps 或者 65 fps 就众说纷纭了,例如知乎上的这个问题为什么安卓不把系统显示帧数提高?
- 为什么是60fps ? 这是因为人眼与大脑之间的协作无法感知超过60fps的画面更新。
- 好像眼睛能识别的帧数低于60很多,而系统到60帧依然很清晰了
- 60fps 完全够了
但是这些答案既没有相关文献引用也没有进行因果关系的分析,用大脚趾思考一下都会感觉不怎么靠谱。
凭借钻研到底的精神,我们一个一个地来细细探究这些问题:
首先,人眼的感知极限并不是 60 fps
我们从维基百科以及果壳中,可以查到:”有了平滑度高的60hz之后,更有极度连贯的120hz的电视推出,而超过大概85赫兹的视频,像是画面每更新一次只会发光几百分之一秒的阴极射线管及等离子显示屏,此时已经到达大脑处理视频的极限,人眼并无法分辨与更高更新率的差异,因此使用主动式快门眼镜的3D电视更新率达到200赫兹或以上,对人眼来说是无法看到左右视角切换的过程。“
因此,人眼的感知极限是高于 60 fps 的。
其次,画面帧率越高,体验越好
维基百科中提到几个重要的帧率数值:
- 12 fps:由于人类眼睛的特殊生理结构,如果所看画面之帧率高于每秒约10-12帧的时候,就会认为是连贯的
- 24 fps:有声电影的拍摄及播放帧率均为每秒24帧,对一般人而言已算可接受
- 30 fps:早期的高动态电子游戏,帧率少于每秒30帧的话就会显得不连贯,这是因为没有动态模糊使流畅度降低
- 60 fps:在实际体验中,60帧相对于30帧有着更好的体验
- 85 fps:一般而言,大脑处理视频的极限
注:如果需要了解动态模糊技术相关知识,可以查阅这里
所以,总体而言,帧率越高体验越好。一般的电影拍摄及播放帧率均为每秒24帧,但是据称《霍比特人:意外旅程》是第一部以每秒48帧拍摄及播放的电影,观众认为其逼真度得到了显著的提示。
但是,目前显示性能优化的极限是 60 fps
这里出现了一个悖论:既然帧率越高体验越好,那为什么我们的显示性能优化只需要做到 60 fps 就 OK 了?具体的原因就要从我们使用的设备说起了。
首先,我们需要明确一点:生成图像的设备(如显卡)与显示图像的设备(如显示器)是分离的。下面我们分别进行讨论:
显示器的刷新频率是固定的
目前, 大多数显示器根据其设定按 30Hz、 60Hz、 120Hz 或者 144Hz 的频率进行刷新。 而其中最常见的刷新频率是 60 Hz。 这样做是为了继承以前电视机刷新频率为 60Hz 的设定。 而 60 Hz 是美国交流电的频率, 电视机如果匹配交流电的刷新频率就可以有效的预防屏幕中出现滚动条,即互调失真。(这样我想起了一个老段子:马屁股决定航天飞机火箭助推器的宽度)
显卡的生成图像的频率是变化的
因为,显卡的生成图像的频率与显示器的刷新频率是相互独立的。因此,就涉及到了一个配合的问题。
最理想的情况是两者之间的频率是相同且协同进行工作的,在这样的理想条件下,达到了最优解。但实际中显卡的生成图像的频率是变化的,如果没有有效的技术手段进行保证,两者之间很容易出现这样的情况:当GPU还在渲染下一帧图像时,显示器却已经开始进行绘制,这样就会导致屏幕撕裂(Tear)。这会使得屏幕的一部分显示的是前一帧的内容,而另一部分却在显示下一帧的内容。如下图所示:
屏幕撕裂(Tear)的问题,早在 PC 游戏时代就被发现, 并不停的在尝试进行解决。 其中最知名可能也是最古老的解决方案就是 V-Sync 技术。
V-Sync 的原理简单而直观:产生屏幕撕裂的原因是显卡在屏幕刷新时进行了渲染,而 V-Sync 通过同步渲染/刷新时间的方式来解决这个问题。显示器的刷新频率为 60 Hz,若此时开启 V-Sync,将控制显卡渲染速度在 60 Hz 以内以匹配显示器刷新频率。这也意味着,在 V-Sync 的限制下,显卡显示性能的极限就限制为 60 Hz 以内。
后话 1:将显示性能的极限限制为 60 fps 加剧了屏幕迟滞(Lag)和卡顿(Stutter)现象
先说迟滞(Lag):
请考虑如下场景:当前显示器频率为 60 fps,某游戏的实时帧率固定为是 12 fps。那么在为 1/12 秒的时间内,显示器将会刷新5次,但显示的都是同一帧的图像。 这时游戏的给人的感觉如同幻灯片一般,这就是迟滞(Lag)。
再说卡顿(Stutter):
前面有提到,当帧率高于 12 fps 时,人眼都会认为画面是流畅的。但是,因为人眼能够识别出 85 fps 以内的帧率变化,所以,当显示器输出画面的帧率不停变化时,人们就会认为画面是卡顿(Stutter)的。
正如先前讨论的那样,V-Sync 仅仅是让显卡在某个确定的时间开始渲染某一帧, 但这并不意味着这一帧就一定能够及时的呈现在你的面前。 仅仅如此, 显卡还是难以匹配显示器的刷新频率, 有时它能满足要求(渲染速度超过 60 fps), 有时就不行了(渲染速度低于 60 fps)。所以在这样的情况下,V-Sync 就带来了新的麻烦: 当帧率低于 60 fps 时将加剧画面的卡顿和迟滞现象, 因为显卡一直在尝试让渲染时间能够与屏幕刷新时间能够匹配。 但开启 V-Sync 后, 40~50 fps 的渲染频率意味着将会使得显示器输出的画面帧率从 60 fps 骤降至 30 fps。如图所示:
后话 2:现代化的显示技术可以绕过这个坑
其实,简单分析全文我们就会发现,这一切的坑都是为了让显卡去适应显示器的频率所造成的。因此,根本的解决方案其实也很简单,掉个头,让显示器去适应显卡的频率。一切就迎刃而解了。
该方案的实现目前有两种实现形式: Nvidia 提出的专利技术 G-Sync 以及 AMD 提出开放标准 FreeSync。
G-Sync
G-Sync 技术于 2013 年底被提出, 它是以显示器的附加模块的形式出现(于2014年初正式产品化)。 G-Sync 模块受专利保护, 它取代了传统显示中的脉冲计数器(scaler)。 但 G-Sync 模块并非真正意义上的硬件计数器, 而是将这部分工作转交 GPU 进行控制。在未获得更多内部实现机制的情况下, 我们只能简单的说 G-Sync 模块用于决定显示器何时(或何频率)绘制下一帧。
该方案的问题在于: 要么显示器制造商在制造显示器时嵌入 G-Sync 模块, 要么用户购买 DIY 套件并安装于兼容的显示器上。 但这都将产生额外的费用。 虽然该方案是有效的, 并且有助于 Nvidia 控制自身成本, 但却显著地提高了显示器的价格。 此外,G-Sync 仅能在配备了高于 GTX 650 Ti 的 Nvidia GPU的PC机上工作。 这意味着使用 AMD 和 Intel 集成显卡的人就不那么不走运了。
FreeSync
在采用 Adaptive-Sync 技术的显示器已经发布的情况下, AMD 于 2014 年初从另一个方面推出了 FreeSync, 截至2015年初依然未有上市计划。 FreeSync 是一个开放标准, VESA(视频电子设备协会)于2014年4月采用 Adaptive-Sync 技术作为 DisplayPort 1.2a 的规范。
Adaptive-Sync 是 AMD 的 FreeSync 必要组成部分, 它使得显示器可以基于GPU来改变刷新率。 而 DisplayPort 是一种通用、 开放的标准, 支持所有的现代显卡和大多数现代显示器。 然而, 应该指出的是, 尽管 Adaptive-Sync 是 VESA DisplayPort 1.2 及 1.3 规范的一部分, 但它是可选的而非强制性的。 这意味着并非所有基于 DisplayPort 1.3 的显示器都会支持 Adaptive-Sync。 虽然我们非常希望能引入这样一个十分强大的通用标准, 但即便是引入 Adaptive-Sync 都会在制造显示器时引入的验证和测试的额外成本。
需要明确区分的是, Adaptive-Sync 是 DisplayPort 的功能, 它允许改变显示器的刷新频率, FreeSync 与 AMD该项技术相偕同是为了通过 Adaptive-Sync 在显示帧被GPU渲染出来时刷新屏幕。
后话 3:目前显示性能的极限是 60 fps,但将来能达到更高的水平
目前, G-Sync、FreeSync 均未普及,但随着新技术的优化及推广,我们有理由相信显示性能的极限将会得到提高!
参考文献:
Why 30 / 60 fps? why not 40, 45, 50 fps?
Android Performance Patterns: Why 60fps?
G-Sync vs FreeSync: The Future of Monitors
维基百科:帧率
果壳问答:人眼能识别的帧数最高是多少?