游戏开发中——垂直同步、绘制效率、显示器刷新频率与帧率

【转】: here缓存

 

从后缓存到显示器      架构

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


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

 

 

 

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

 

交换帧率与刷新帧率get

              一般咱们很在乎渲染的效率,其实就是绘制的效率,这就是图中的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帧以上。

相关文章
相关标签/搜索