谈谈我对画面撕裂,垂直同步,Freesync以及G-sync的理解「建议收藏」

谈谈我对画面撕裂,垂直同步,Freesync以及G-sync的理解「建议收藏」最近一直在接触图形学相关的知识,感觉之前在学OpenGL的时候不需要思考帧缓冲是怎么处理到显示器上的,驱动都帮我做好了,现在在接触vulkan的时候发现自己对Swapchain这个东西的工作原理不是很了解,去网上搜索资料的过程中发现了垂直同步这个知识点,以前玩游戏的时候也经常看到但是不明白什么意思(对不起!我不是一个合格的游戏玩家>-<),觉得自己还是得搞清楚一下,于是整理了一下自己对…

大家好,又见面了,我是你们的朋友全栈君。

最近一直在接触图形学相关的知识,感觉之前在学OpenGL的时候不需要思考帧缓冲是怎么处理到显示器上的,驱动都帮我做好了,现在在接触vulkan的时候发现自己对Swapchain这个东西的工作原理不是很了解,去网上搜索资料的过程中发现了垂直同步这个知识点,以前玩游戏的时候也经常看到但是不明白什么意思(对不起!我不是一个合格的游戏玩家>-<),觉得自己还是得搞清楚一下,于是整理了一下自己对垂直同步及相关概念的理解

开始正文!

CRT是阴极射线管显示器,以传统的CRT显示屏刷新显示来看,他的工作方式是从上往下从左往右的顺序不断读取某个特定内存缓冲中的数据来刷新屏幕上的显示,渲染程序也同时不断更新该内存缓冲以达到输出动态的画面。

显示器会存在一个刷新频率的因素:以Hz为单位,一般是60Hz或144Hz,由显示器决定,这是一个比较固定的数值,不会有太大的浮动,可能温度会影响这个频率吧(显示器,硬件决定);渲染程序也会存在一个刷新频率的因素: 以FPS(帧每秒)为单位,因为这个刷新是由应用程序控制的,影响因素会很多,比如CPU,GPU的影响,算法的影响,这些都会影响计算一个画面所需要的时间,从而影响该频率(应用程序和CPU,GPU,主要是程序,其次是硬件)

那么当两个频率不一致时,很容易出现几种问题:

该怕地裹紧小被子

1、画面撕裂

什么是画面撕裂呢,画面撕裂就是显示器在显示一个画面时,中间存在一条或多条明显的“分界线”,这一般是由于每秒帧数要高于刷新频率,可能显示器单位时间内显示1个画面,而程序已经计算出了第二帧,显示器在刷新第一帧画面到一半的时候,也就是频幕中间那个位置,剩下的图像已经被应用程序替换成了第二帧,没有办法,第一帧剩下的一半已经被丢弃了,显示器只能将第二帧的下半部分和第一帧的上半部分拼在一起显示,这样就会有一个明显的分界线,这就是画面撕裂

FPS与刷新率同步
FPS与刷新率同步
谈谈我对画面撕裂,垂直同步,Freesync以及G-sync的理解「建议收藏」
FPS高于刷新率画面出现撕裂

 

 

 

 

 

2、跳帧

原理也是和画面撕裂一样的,画面撕裂只是在显示过程中丢弃了某帧一部分,跳帧就是正好那一个帧都被完整丢弃了

3、输出延迟

上面两个问题都是因为FPS高于刷新率,那么输出延迟差不多是FPS低于刷新率,显示器在刷新玩一个画面后发现第二帧图像还没计算出来,没办法只能继续显示第一帧内容,导致了延迟,由于可能第二次刷新画面到一半时,第二帧图像来了,这又出现了画面撕裂。

输出延迟是一个很头疼的问题,代表你的CPU、GPU不过关,或者说这个渲染程序算法太复杂了,有一个特殊情况可以避免FPS过低导致的画面撕裂,就是当FPS是刷新率的约数的时候,因为可以凑整的嘛。这大概也是为什么显示器选择刷新率为60Hz或144Hz的原因,因为它们的约数多啊,60一共有11个约数,144一共有12个约数
60Hz:30Hz,20Hz,15Hz,12Hz,10Hz,6-1Hz
144Hz:72Hz,48Hz,36Hz,24Hz,18Hz,16Hz,12Hz,8Hz,6Hz,4Hz,2-1Hz

谈谈我对画面撕裂,垂直同步,Freesync以及G-sync的理解「建议收藏」

由于两个频率不一致会出现这些问题,那么需要一些手段来让两个频率达到一致或者说同步,就不会出现还没用就被丢弃这样的性能浪费和画面撕裂这种头痛的问题

垂直同步、Freesync、G-Sync,这里有三种同步方式(sync理解成同步)

 其中垂直同步是早期技术,当时还没办法用应用程序控制显示器的刷新频率,所以这种同步是控制应用程序方面帧输出的频率达到和显示器一样的, 垂直同步相对于其他两个技术的优点就是泛用性强,不存在显示器不支持调整频率就无法使用的情况,不受设备的限制。

采用垂直同步其实就是在FPS高于刷新率的时候压低FPS,而FPS低于刷新率的时候就失去了意义,还是会出现频率不一致时的相关问题,所以在FPS低于刷新率的时候不建议开启垂直同步,开了其实影响不大。

FreesyncG-Sync则是垂直同步升级版,在垂直同步发展了一段时间之后,出现了允许调整刷新频率的显示器,在FPS高于刷新率的时候和垂直同步差不多,但是在FPS低于刷新率的时候,他可以调整刷新率以适应FPS,不一定要调到和FPS一样,只要调成是FPS的倍数就能避免画面撕裂,原因在上文说了
    Freesync是AMD公司的技术,比G-Sync更早出现
    G-Sync是Nvidia公司的技术,G-Sync不免费,支持G-Sync的显示器价格会比支持Freesync的显示器贵些,如果你是nvidia的忠实粉,那你当然会选择G-Sync对吧,(只有小孩才做选择,我全都要,手动滑稽)
    后两者在实现细节上是肯定有差异的但是原理一致

总结一下吧,这些问题都是由于FPS以及刷新率这两个频率的不同导致的,而解决方案就是将两个频率同步,这样既能避免渲染过多且多余图像的浪费,又能保证画面的舒适流畅,相对于垂直同步这个比较年迈的技术,AMD公司的Freesync和Nvidia公司的G-Sync这两个技术优化了垂直同步,原本只能压低FPS来保持同步,现在能同通过调整显示器的刷新率来解决这些画面问题

再说一下,Freesync和G-Sync技术调整刷新率的范围并不是1到最大刷新率的,而是有一个规定范围

参考的文献资料网上有很多,我就不列出来了^-^

最后祝大家工作顺心如意

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/132773.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 解决SQLyog连接MySQL8时报错:错误号码2058

    解决SQLyog连接MySQL8时报错:错误号码2058远在天边,近在眼前。

    2025年8月13日
    10
  • 推荐自用黑苹果Clover引导主题「建议收藏」

    1.使用CloverConfiguration编辑软件修改启动主题挂载分区打开分区选择自己的config.plist文件打开文件选择“`引导界面“`修改主题保存CloverConfiguration的修改2.将主题文件复制到clover主题文件夹‘themes’下3.然后重启电脑就会出现主题了…

    2022年4月9日
    250
  • php分页样式,thinkphp分页样式修改

    php分页样式,thinkphp分页样式修改用tp框架内置的分页很容易实现分页功能。首先是实例化数据表,然后统计数据,最后进行实例化分页类并按自己需要显示。但是内置的分页样式可能不喜欢,感觉不是那么友好。所有可以个性化修改一下。手册也提供了方法进行修改个性化样式。这是效果图这个分页效果我还是蛮喜欢的,作为我留言吧的分页足够了。首先当然是修改tp的样式$configs=$setting->showAll();$count=$…

    2022年7月17日
    14
  • Java内存管理-初始JVM和JVM启动流程(二)

    勿在流沙住高台,出来混迟早要还的。做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!上一篇分享了什么是程序,以及Java程序运行的三个阶段。也顺便提到了Java中比较重要的一个东西就是JVM(JAVA 虚拟机),那么今天在先了解一下JVM和JVM的启动流程。 知识地图:1、什么是虚拟机虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系…

    2022年2月28日
    41
  • Android 系统签名打包方法

    Android 系统签名打包方法方式一命令行生成(推荐):此方式不需要配置,步骤也不多。1、在应用程序manifest.xml文件根节点中加入属性:Android:sharedUserId=“android.uid.system”;2、在android系统目录build/target/product/security/拷贝系统签名文件:platform.x509.pem、platform.pk8;3、在out/host/linux-x86/framework目录下找到signapk.jar文件;4、把三个文件(plat

    2022年6月21日
    25
  • RuntimeException异常

    RuntimeException异常/*Exception中有一个特殊的子类异常RuntimeException(运行时异常)。 *RuntimeException非常特殊,它的的子类也可以直接抛出,不用声明。 *1.如果在函数内容抛出该异常,喊上可以不用声音,编译通过。 *2.如果函数上声明了该异常,调用者可以不用进行处理,编译一样能通过。 *3.之所以不用在函数上声明,因为不需要让调用者处理。 *4

    2022年7月24日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号