垂直同步、绘制效率、显示器刷新频率与帧率(转)

从后缓存到显示器      

最近在看D3D的架构,在这过程中对帧率这个一直认为很简单的东西有了更多的理解。在过去看来,帧率就是显卡渲染一帧所用时间的倒数,现在看来远远不是这个样子。

要真正理解这个问题要从绘制数据从显存中到屏幕的这一个过程来说起,下图就是这个过程

显存中存在前后缓存,前缓存就是屏幕上最终看到的像素,而后缓存是绘制使用,后缓存绘制好一帧,通常就交换一次,写给前缓存,而显示器则从前缓存不断的读取数据。

交换帧率与刷新帧率

通常我们很在意渲染的效率,其实就是绘制的效率,这就是图中的f1,也成为交换帧率,f1决定了显卡一秒能绘制多少次,以前一直以为这就是用户的帧率了,其实不是,因为还有其他因素。

我们看到显示器读取前缓存也存在一个频率,即f2,f2也被称为显卡的刷新频率,即显卡按照多少的频率去讲前缓存的数据给显示器绘制一次,它不管前缓存的数据是否是新的还是旧的。由此可见我们最终用户看到的帧率是f1 和 f2的共同结果。实际的帧率f应该表述为显示器所能表现的缓存交换帧率,即在1秒内有多少个后缓存的传递到了显示器。这样看f=min(f1,f2),即受这两个帧率的制约了。比如说你渲染很快,一秒绘制60次,但是显卡一秒只想显示器刷30次,那帧率最高也只有30,再比如你渲染很慢,因为模型特别大,一秒画10次,显示器一秒刷60次,那用户看到的实际帧率也只有10。到这里似乎帧率是被这两者决定的,但是其实还不是这样。

垂直同步与帧率

从图中可以看到一点就是前缓存处于被后缓存写而被显示器读的状态,那么这过程就极有可能发生读写冲突,而显示器的绘制是从上到下一行行刷新的,一种典型的情况就是显示器在读这一帧时前缓存被写入新的下一帧数据,那么显示器的上部分和下部分将显示不同帧的画面,这就是常出现的“画面撕裂”现象,他就是因为缓存交换太快不等显示器读完而造成的。

为了解决这个现象,引入了“垂直同步”的相关技术,垂直同步就是指显示器从上到下绘制一个完整帧的画面的一个过程,在这个过程中,显卡保证不去改变前缓存,如果这过程绘制好一帧,那么后缓存发现前缓存在被读取就不进行交换操作,这样的结果会保证显示器绘制不被撕裂,但是也带来了另一个问题,就是卡帧率,因为正常的交换帧率被显示器的垂直同步各种打断掉,交换帧率大大降低,降低最终帧率。

看来垂直同步与不垂直同步是两个极端,他们分别代表着最高的画面完整度与最高的帧率。所以在实践中就产生了很多种折中的办法,就是允许显卡最多在n帧刷新中只打断一次缓存交换,n越大越接近完全不用垂直同步,帧率越高,n越小越接近垂直同步,撕裂现象概率越小。垂直同步、不垂直同步和几种折中其实就对应了D3D9的交换参数的D3DPRESENT_DONOTWAIT、D3DPRESENT_INTERVAL_IMMEDIATE和D3DPRESENT_INTERVAL_ONE(~FOUR)。那么最终的帧率f应该接近与min{f1-min{f1,f2}/(1+n),f2},通常f2都是足够大的。

 

           所以帧率不仅与交换帧率、刷新帧率有关,还与垂直同步策略有关,所以我们可以看到一些玩家的游戏中关闭垂直同步会卡机,也有一些玩家打开垂直同步会降低帧率,就是这个原因。

显存

              当然我们看到垂直同步会制约帧率的时候,是因为我们这个图中的的前缓存存只有一处,处于读写冲突状态,那么会想只要让显存不存在这种状态不就行了吗,那需要显存非常大,后缓存是生产者,显卡是消费者,前缓存如果足够的大(可以分成n多块),那么生产者就有可能不用顾忌的往缓存上堆新东西,事实上完全的不存在冲突是不太可能的,因为显存的大小永远存在一个限制,只要缓存大小有限制,就必然可能出现生产者和消费者的冲突,存在冲突,要么选择生产者等消费者(生产降低,即帧率降低),要么消费者拿到的东西会紊乱(即撕裂),但是显存越大,这种潜在的冲突的可能性就越小,问题就越容易避免。

所以我么看到显卡显存较大的客户端及时完全关闭垂直同步(即理论最大帧率)也不太容易撕裂,或者完全打开垂直同步帧率还是非常高,显存不仅有利于绘制也有利于解决前缓存冲突提高帧率。

基于这些思考,所以在选择渲染策略时,一定要充分考虑垂直同步的策略,根据潜在用户的硬件、游戏的绘制效率、刷新效率一起考虑,知道帧率是由绘制效率,显卡刷新效率和垂直同步策略三者共同决定的。在D3D9中微软推荐使用的垂直同步策略时D3DPRESENT_INTERVAL_ONE,即最接近完全垂直同步的折中策略,即最多在一次显卡刷新中打断一次缓存交换,实际帧率应该是接近于f1/2,如果最终用户看到的要在30帧的话,z在f2是60的情况下,那么f1要在60帧以上。

时间: 2024-10-05 14:27:39

垂直同步、绘制效率、显示器刷新频率与帧率(转)的相关文章

修改360抢票的刷新频率+突破8车次限制,太简单了

刚分享了一下12306网站刷票防挂js,居然没几个人看,估计都用其他刷票软件了,我之前一直用百度卫士自带的刷票工具,结果今天大家刷的太厉害了,12306不稳定,导致老是登录失败.于是不得不转向国民力荐的360抢票.打开刷票页面,居然让我必须安装360浏览器,这让人很无语.找了半天破解的方法,终于可以刷票了,结果发现360插件中的helper.dll无法在chrome中调用(chrome在45+后彻底废弃了NPAPI),所以虽然能刷票,但不能自动识别验证码,最后不得不下载360浏览器刷票专版了.

10分钟,利用canvas画一个小的loading界面(顺便讨论下绘制效率问题)

首先利用定义下canvas得样式 <canvas width="1024" height="720" id="canvas" style="border: 1px solid #808080;display: block;margin: 100px auto;>你的游览器不支持canvas</canvas> 这里主要要说的就是宽高,不要在style里面定义,不然会被拉伸.(对于这点,建议大家看下W3c文档,不是很

使用EXCEL RTD函数设置刷新频率的方法

RTD函数默认的刷新频率是2000ms,这意味着你在使用RTD展示股票行情信息,不会获得市场上发生的每一次价格变动. Microsoft RTD接口有一个ThrottleInterval属性,用于确定数据刷新之间的间隔.可以手动将节流间隔更改为较小的值,以提高实时数据的刷新率. 改变ThrottleInterval属性最简单的方法是通过VBA: 1.在Excel中,按Alt_F11进入Visual Basic编辑器窗口. 2.在Visual Basic编辑器窗口中,单击View ->即时窗口或按

VSync Count 垂直同步

原地址:http://blog.csdn.net/yesy10/article/details/7794556 Unity3D中新建一个场景空的时候,帧速率(FPS总是很低),大概在60~70之间.一直不太明白是怎么回事,现在基本上明白了.我在这里解释一下原因,如有错误,欢迎指正.在Unity3D中当运行场景打开Profiler的时候,我们会看到VSync 这一项占了很大的比重.这个是什么呢,这个就是垂直同步,稍后再做解释.我们可以关闭VSync来提高帧速率,选择edit->project se

三星称王曲面显示器 或统领未来市场

在电脑的所有外设部件中,显示器是唯一一个决定着视觉体验的关键部件.从初期的CRT显示器到目前正成潮流的曲面显示器发展历程来看,对视觉体验的追求和超越已成为显示器行业发展的必然,其中曲面显示器的火爆现象,更是驱动着这一潮流喷涌前进. 据京东官方的统计数据显示,在刚刚过去的"618电商购物节"活动中,显示器品类销售火爆,其中三星曲面显示器销售量达到1.2万台规模,成为位列AOC.戴尔.飞利浦和LG之首的第一品牌,成为当天的大赢家,其旗下的C27F390FH.S24D360HL.C24F39

Android渲染机制和丢帧分析

http://blog.csdn.net/bd_zengxinxin/article/details/52525781 自己编写App的时候,有时会感觉界面卡顿,尤其是自定义View的时候,大多数是因为布局的层次过多,存在不必要的绘制, 或者onDraw等方法中过于耗时.那么究竟需要多快,才能给用户一个流畅的体验呢?那么就需要简单了解下Android的渲染机制: Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染,那么整个过程如果保证在16ms以内就能达到一个流畅的画面. 那么

Google 发布 Android 性能优化典范

2015年伊始,Google发布了关于Android性能优化典范的专题, 一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有关性能问题的底层工作原理,同时也介绍了如何通过工具来找出性能问题以及提升性能的建议.主要从三个 方面展开,Android的渲染机制,内存与GC,电量优化.下面是对这些问题和建议的总结梳理. 0)Render Performance 大多数用户感知到的卡顿等性能问题的最主要根源都是因为渲染性能.从设计

[Android Pro] Android性能优化典范第一季

reference to : http://www.cnblogs.com/hanyonglu/p/4244035.html#undefined 2015年伊始,Google发布了关于Android性能优化典范的专题,一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有关性能问题的底层工作原理,同时也介绍了如何通过工具来找出性能问题以及提升性能的建议. 主要从三个方面展开,Android的渲染机制,内存与GC,电量优化.下

Android性能优化典范(一)

2015年伊始,Google发布了关于Android性能优化典范的专题,一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有关性能问题的底层工作原理,同时也介绍了如何通过工具来找出性能问题以及提升性能的建议.主要从三个方面展开,Android的渲染机制,内存与GC,电量优化.下面是对这些问题和建议的总结梳理. 0)Render Performance 大多数用户感知到的卡顿等性能问题的最主要根源都是因为渲染性能.从设计师的