引用注明>> 【作者:张佩】【原文:www.YiiYee.cn/blog】
2014年中,我在公司内部提交了一个名为“异步Timing”(又名“异步V-Sync”)创新方案,用于解决GPU使用V-Sync同步所导致的问题。但十分可惜的是,Intel的创新审核委员没有通过我的方案,只礼貌性地回了一封感谢邮件。这件事情本来尘埃落定,我已不作多想。但最近很多IT新闻介绍了AMD在今年CES上所展示的一项FreeSync技术,惊喜颇多。我发现AMD的FreeSyn技术所要解决的问题和采取的策略,与我的“异步Timing”的设计方案十分相似。我写作此文,向大家介绍V-Sync的基本概念和产生的问题,以及异步Timing方案的细节。
在计算机图形显示系统中,这几个概念是相互关联的:Timing(时序),V-Sync(垂直同步),Refresh Rate(刷新率)。它们是从同一个地方衍生出的概念:Timing Controller(时序控制器,简称T-Con)经过配置后产生连续的Timing时序,Timing时序决定了何时会产生一个V-Sync中断;显示器每收到一个V-Sync中断,便开始一次显示刷新;显示器每秒刷新的次数就对应了它的Refresh Rate(刷新率)。
GPU使用的T-Con所产生的都是等时 Timing (Isochronous Timing):即固定频率的Timing,在固定时间间隔内产生一个 脉冲(Pulse),脉冲的上升沿代表将产生一个V-Sync中断。系统必须同步于Timing:显示器在收到V-Sync时进行显示刷新,显卡根据V-Sync进行图形渲染(Render)。
等时 Timing
Timing是显卡设备和输出设备进行同步的关键。等时Timing产生固定频率的脉冲信号,以将显卡的渲染(Render)和monitor的显示(Display)进行同步。但是显卡每次渲染任务的轻重程度是不相等的,根据被处理数据的复杂程度,渲染所耗费的时间长短不一。换句话说:渲染是天然不等时的,而显示器总是等时地刷新内容,二者将因此产生矛盾。
另一方面,很多时候,系统显示静态图像或桌面内容长时间不变,这使得GPU在很长时间内没有新内容可供其渲染,而显示器却一如既往地进行刷新,显示内容却未改变。
等时Timing导致了两个方面的缺点:渲染过程中的FPS(Frames Per Second每秒帧数)损失,显示过程中的电能损失。
FPS损失
显卡的渲染操作要和V-Sync同步,以避免画面的撕裂。假设只有一个Frame Buffer的情况下,平均渲染一个Frame需要1.1 个V-Sync时间。第一个V-Sync到来时当前渲染还没有结束,只能继续占用下一个V-Sync周期。在第二个V-Sync周期,显卡其实只需要0.1时间。但因为渲染必须与V-Sync同步,使得显卡在剩下的0.9时间内不能再使用Frame Buffer以免污染其中未被显示的帧数据。等到第二个V-Sync到来时,显卡提交Frame Buffer内容后,才能安全地继续渲染新的下一帧。在这个示例中,显卡为了与V-Sync同步,它对硬件的使用效率只有11/20(~50%),严重浪费了硬件资源。
在使用单Frame Buffer的情况下,硬件资源的浪费最大接近于1/2。使用Double Frame Buffer或Tri Frame Buffer可改善这种情况:使用Double Frame Buffer配置的最大的浪费接近于1/3,使用Tri Frame Buffer配置的最大浪费接近于1/4。硬件资源的浪费,导致一些Frame的渲染被延迟或丢弃,从而导致FPS损失。
很多3D软件和游戏提供选项让用户禁用V-Sync同步以充分利用硬件的渲染能力。但禁用V-Sync会导致画面撕裂的情况,体验很不好。以Single Frame Buffer为例:
在第二个V-Sync周期内,第一个Frame已经在0.1时间内渲染完成,显卡如果不等待下一个V-Sync中断而继续进行渲染操作,就会把新的内容填入到Frame Buffer中,从而覆盖掉上一次渲染出的一部分内容。在下一个V-Sync到来时,用户看到的就是一个两帧上下重叠的撕裂画面。
能耗损失
和D3D软件追求FPS最大化的情况相反,用户在一般使用电脑时,如使用office软件或浏览网页时,显示内容的更新速度是很慢的,可能几秒或十几秒钟保持桌面内容不变。但LCD显示器并不知道这一点,对于60Hz的固定刷新率而言,显示器会把相同的显示内容每秒钟重复刷新屏幕60次。导致了很大的能耗损失。这种能耗损失是结构性的,如此大的结构性能耗损失,对于移动设备更是十分地致命。
异步 Timing
基于等时Timing的上述缺点,本文将引入异步 Timing。他的核心原理是:显卡完成一帧内容的渲染后,动态产生V-Sync中断通知显示器刷新;动态V-Sync产生后,显卡可以立即渲染新的帧内容,不必有任何的等待;而显示器只在必要时才刷新屏幕,极大地降低了能耗。下图是关系图。
下图描述了异步 Timing的形态,它产生非等时的脉冲信号,每个脉冲表示一个V-Sync的产生。当没有脉冲时,表示显卡还没有渲染出新的帧内容,在此期间,显示器不必刷新。
实现方法
本节提出两种可能的异步 Timing的实现方法。
方法1:动态脉冲
改造当前使用的等时 Timing的控制器(T-Con),让它能够接受外部指令,并在接到外部指令时实时产生一个脉冲,从而产生V-Sync中断。
方法2:特殊通信通道
在显卡和显示器之间建立特殊的数据通道来通知异步V-Sync的产生,可借助现有的数据通道,如DVI/HDMI的I2C Channel,DP的Aux Channel。
异步 TIMING 的频率
异步 Timing没有固定的频率,只有当显卡有渲染好的内容时,才产生一个信号。现实情况下,大多数LCD显示器的电子元器件有漏电的情况,会导致信号衰退,所以需要维持一个最低的屏幕刷新率来抵消信号衰退的影响。可以让显示器提供最小刷新率信息,并由显卡来满足。
显示器端的处理
除了提供最小刷新率信息外,显示器端的改变很少。显示器在收到V-Sync中断时,以原来的逻辑处理新的帧内容。唯一变化是原来等时的V-Sync变成了非等时的。也就是显示器在处理完一帧内容后,等待时间将变得长短不一。
下图中VP是处理一帧内容的全部时间,VDISP是处理可视部分内容的时间,VFP是处理完可视内容后的回扫时间。在等时 Timing中,VFP之后就紧接着是下一帧的VS时间;但异步 Timing中,VFP之后是长短不一的等待时间。
9,323 total views, 3 views today
好象-- 这个就对显示器显卡等硬件提出要求了吧- - 估计现在不太会量产- -?
现在基本上还是争取先缓存,争取在VBLANKIN和VBLANKOUT的时候把缓冲区更新掉,毕竟>60HZ,显示器也只能丢弃~
但是,好象D3D也没有把这个接口给出来,可能给不出来:D,以前的游戏主机这个消息好象会写在芯片的某些字段上的,不过那是硬件了
可是,Intel造显卡,却不生产显示器的。显示器端可利用动态vblank实现动态分辨率,FreeSync就是这么实现的。显卡所需的改变也不大,动态通知同步信号即可。fps的理论最大值是显示器的刷新率,多余的处理能力只能抛弃。异步timing让fps向这个最大值尽量靠拢。
请问这个和NVIDIA 的 g-sync是什么关系呢?我的意思是您的v-sync设计初衷是省电,而g-sync设计目的是高性能游戏,可以这么理解不?
V-Sync的作用是同步,没有省电的作用。G-Sync通过一个增加的硬件模块,让GPU能够尽可能满负荷地工作,避免V-Sync同步对它的限制,提高FPS。
外行不足于论道,只是从逻辑角度理解这个问题。来自系统的GUI任务是随机的,如作者所说,可能很久没有GUI任务,也可能完成所有待处理的GUI任务需要几个V-Sync时段。CRT显示器不定时刷新,屏幕会闪烁,我想定时刷新的设计也来源于此种需求。如果真要改善设计,那就要大改。把定时刷新的工作交给显示器,显卡负责GUI绘制和将数据传送给显示器。多长时间刷新一次,是显示器的事,像LCD显示器,可以长时间刷新。显卡在GUI绘制完成之后,通知显示器,数据已更新。显示器可以据此刷新显示。
电脑技术,处处都有历史局限的影子。没有人可以站在后来的发展上进行当前的设计。所以,每一步的改进都是不易的,推倒重来就更不可能。如果刚开始不使用CRT显示器,整个架构可能就不是现在这个样子。
异步Timing不适用于CRT显示器,CRT工作原理需要不断刷新来抵消信号衰竭,所以有刷新率的要求。实际上大多数LCD显示器也有类似的信号衰竭问题,只不过我们一般把分辨率设置得很大,那点衰竭根本不成问题。你提到创新。创新不是发明,而是在继承的基础上所做的变革,如果一成不变地继承,世界就会停滞;推倒重来可能代价太大,所以往往保留其接口以统一观感,调整内在以顺应形势。现在的显示系统,大多数设计都来自CRT时代,那是个历史非常悠久的年代。现在,CRT的时代已经过去,原理和材料完全改变了,所以创新是必然的。