【转】: here

从后缓存到显示器      

最近在看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帧以上。

转载于:https://www.cnblogs.com/chenhuan001/p/8370924.html

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

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

    (转) 垂直同步.绘制效率.显示器刷新频率与帧率 从后缓存到显示器       最近在看D3D的架构,在这过程中对帧率这个一直认为很简单的东西有了更多的理解.在过去看来,帧率就是显卡渲染一帧所用时间的 ...

  2. 垂直同步、绘制效率、显示器刷新频率与帧率

    转:https://blog.csdn.net/leonwei/article/details/7998412 从后缓存到显示器 最近在看D3D的架构,在这过程中对帧率这个一直认为很简单的东西有了更多 ...

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

    从后缓存到显示器       最近在看D3D的架构,在这过程中对帧率这个一直认为很简单的东西有了更多的理解.在过去看来,帧率就是显卡渲染一帧所用时间的倒数,现在看来远远不是这个样子. 要真正理解这个问 ...

  4. 显示器刷新频率与帧率、垂直同步以及绘制效率

    从后缓存到显示器       最近在看D3D的架构,在这过程中对帧率这个一直认为很简单的东西有了更多的理解.在过去看来,帧率就是显卡渲染一帧所用时间的倒数,现在看来远远不是这个样子. 要真正理解这个问 ...

  5. Android游戏开发中绘制游戏触摸轨迹的曲线图

    本篇文章主要来讲解怎样绘制游戏触摸轨迹的曲线图. 我们在onTouchEvent方法中,可以获取到触摸屏幕时手指触摸点的x.y坐标,如何用这些点形成一条无规则轨迹并把这条无规则轨迹曲线显示在屏幕上就是 ...

  6. VR硬件演进与其游戏开发中的若干注意事项

    最近两年虚拟现实(Virtual Reality,简称VR)从刚刚走进公众视野到逐渐变得炙手可热,很多不同领域的IT开发者都想进入虚拟现实领域.本篇文章将首先讲解VR入门所需要学习的知识,然后从VR软 ...

  7. 游戏开发中常用的数据结构和算法

    转载Loving_初衷 前言 时间流逝,物是人非,就好像涌动的河流,永无终焉,幼稚的心智将变得高尚,青年的爱慕将变得深刻,清澈之水折射着成长. ----------<塞尔塔传说> PS:为 ...

  8. 移动端h5游戏开发中的动画和动效展示

    在移动端h5游戏开发中,经常会遇到动画和动效的展现需求,比较常用的实现方法有css3.svg.定时器等,针对不同的场景和需求使用不同的技术,可以提升设计和开发的效率,保证产品的效果和质量,也能让用户有 ...

  9. 【《Real-Time Rendering 3rd》 提炼总结】(十一) 第十四章 : 游戏开发中的渲染加速算法总结

    本文由@浅墨_毛星云 出品,转载请注明出处.   文章链接: http://blog.csdn.net/poem_qianmo/article/details/78884513 导读 这是一篇1万3千 ...

最新文章

  1. jdk1.6连接sqlserver2005
  2. dos系统 关闭服务器,如何开启或关闭服务程序?巧用DOS命令全攻略
  3. c# 读取txt方法
  4. TasksetManager冲突导致SparkContext异常关闭
  5. (76)Verilog HDL测试激励:时钟激励3
  6. 清华大学黄民烈老师:本科生如何做出好的科研
  7. Ubuntu更改分辨率
  8. MySQL配置文件配置
  9. 我对秒杀在技术性上的一些看法
  10. 数据库分类及主流数据库对比
  11. c#获取电脑硬件信息参数说明(声卡篇 Win32_SoundDevice )
  12. 1466:Girls and Boys:优美的拆散早恋学生?
  13. HarmonyOS助力构建“食用菌智慧农场”
  14. amd cpu 型号大全
  15. win10 激活工具 Re-LoaderByR@1n.exe
  16. springboot 项目启动报错 url' attribute is not specified and no embedded datasource could be configured
  17. HTTP/2 stream 1 was not closed cleanly before end of the underlying stream
  18. lisp调用qleader端点_常用函数.lsp - AutoLISP/Visual LISP 编程技术 - CAD论坛 - 明经CAD社区 - Powered by Discuz!...
  19. java反转字符串的方法
  20. Java各数据库的JDBC驱动包下载地址

热门文章

  1. 计算机毕业设计 SpringBoot+Vue拍卖竞拍系统 拍卖管理系统 网上拍卖系统 网络拍卖系统
  2. HTTP协议的无状态和无连接
  3. 《网络是怎样连接的》第四章 接入网,网络运营商
  4. 面向垂直行业的5G核心网关键技术演进分析
  5. 交通运输SCI、EI、ISTP简介
  6. 查看端口(3306)被那个程序占用
  7. 零打碎敲学Android 五 —AVG,只有神知道的世界
  8. Redis 事件循环函数serverCron
  9. cuDNN 的初始设计
  10. VS Code安装Python3开发环境