GPU异步V-Sync技术方案

引用注明>> 【作者:张佩】【原文:www.YiiYee.cn/blog

2014年中,我在Intel内部提交了一个名为“异步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之后是长短不一的等待时间。

时间: 2024-10-07 11:11:17

GPU异步V-Sync技术方案的相关文章

iOS开发--四种多线程技术方案

iOS 多线程的四种技术方案 image pthread 实现多线程操作 代码实现: void * run(void *param) { for (NSInteger i = 0; i < 1000; i++) { NSLog(@"---buttonclick---%zd---%@", i, [NSThread currentThread]); } return NULL; } @implementation ViewController - (IBAction)clickBut

在线客服系统 开发实战系列(一:需求分析及技术方案初步选型)

在这个系列的文章里,我将尝试一步一步开发一套功能完备的在线客服系统,并最终将其开源在 Git 上,欢迎关注. 鉴于水平限制,难免有所疏漏,欢迎批评指正. 文章将分为几个部分 一.需求分析及技术方案初步选型 二.技术方案选型,验证 三.底层框架设计,开发 四.服务器设计开发 五.客户端设计开发 六.Web端设计开发 在这个系列的文章中,您将了解并学习到以下技术知识: MSMQ.YUI.WebSocket.WinForms 如果这些技术对您有用,还请您 推荐 一下本文章,谢谢! 首先我们大概看看什么

基于IOS和Android设备MDM技术方案服务价格

导读:前段时间 www.mbaike.net 博客被恶意攻击,导致程序崩溃,目前已经替换了以前的Wordpress程序,现提供IOS和Android版本MDM的代码和相关文档咨询服务. 一.IOS版MDM服务内容及价格: 套餐一:IOS端MDM Server代码(提供MDM Server端的代码和部署文档,不含后期技术支持) 3000元套餐二:IOS端MDM开发技术顾问(提供MDM开发的顾问服务,协助理解MDM原理流程及搭建MDM Server工作的咨询) 1500元套餐三:IOS端MDM全部服

Python web实时消息服务器后台推送技术方案---GoEasy

Goeasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送!个人感觉goeasy推送更稳定,推送速度快,代码简单易懂上手快浏览器兼容性:GoEasy推送支持websocket 和polling两种连接方式,从而可以支持IE6及其以上的所有版本,同时还支持其它浏览器诸如Firefox, Chrome, Safari 等等.支 持不同的开发语言:   GoEasy推送提供了Restful API接口,无论你的后台程序用的是哪种语言都可以通过RestfulAPI来实现后台实时推送.

C(++) web实时消息服务器后台推送技术方案---GoEasy

Goeasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送!个人感觉goeasy推送更稳定,推送速度快,代码简单易懂上手快浏览器兼容性:GoEasy推送支持websocket 和polling两种连接方式,从而可以支持IE6及其以上的所有版本,同时还支持其它浏览器诸如Firefox, Chrome, Safari 等等.支 持不同的开发语言:   GoEasy推送提供了Restful API接口,无论你的后台程序用的是哪种语言都可以通过RestfulAPI来实现后台实时推送.

node.js web实时消息服务器后台推送技术方案---GoEasy

Goeasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送!个人感觉goeasy推送更稳定,推送速度快,代码简单易懂上手快浏览器兼容性:GoEasy推送支持websocket 和polling两种连接方式,从而可以支持IE6及其以上的所有版本,同时还支持其它浏览器诸如Firefox, Chrome, Safari 等等.支 持不同的开发语言:   GoEasy推送提供了Restful API接口,无论你的后台程序用的是哪种语言都可以通过RestfulAPI来实现后台实时推送.

Websocket web实时消息服务器后台推送技术方案---GoEasy

Goeasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送!个人感觉goeasy推送更稳定,推送速度快,代码简单易懂上手快浏览器兼容性:GoEasy推送支持websocket 和polling两种连接方式,从而可以支持IE6及其以上的所有版本,同时还支持其它浏览器诸如Firefox, Chrome, Safari 等等.支 持不同的开发语言:   GoEasy推送提供了Restful API接口,无论你的后台程序用的是哪种语言都可以通过RestfulAPI来实现后台实时推送.

分布式锁1 Java常用技术方案

前言:       由于在平时的工作中,线上服务器是分布式多台部署的,经常会面临解决分布式场景下数据一致性的问题,那么就要利用分布式锁来解决这些问题.所以自己结合实际工作中的一些经验和网上看到的一些资料,做一个讲解和总结.希望这篇文章可以方便自己以后查阅,同时要是能帮助到他人那也是很好的. ===============================================================长长的分割线===================================

请给出异步加载js方案

请给出异步加载js方案,不少于两种 默认情况javascript是同步加载的,也就是javascript的加载时阻塞的,后面的元素要等待javascript加载完毕后才能进行再加载,对于一些意义不是很大的javascript,如果放在页头会导致加载很慢的话,是会严重影响用户体验的. 异步加载方式: (1) defer,只支持IE (2) async: (3) 创建script,插入到DOM中,加载完毕后callBack,见代码: function loadScript(url, callback