谈谈我对画面撕裂,垂直同步,Freesync以及G-sync的理解

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

开始正文!

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

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

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

该怕地裹紧小被子

1、画面撕裂

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

FPS与刷新率同步
FPS与刷新率同步
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,这里有三种同步方式(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到最大刷新率的,而是有一个规定范围

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

最后祝大家工作顺心如意

### Perfetto 画面撕裂解决方案 Perfetto 中的画面撕裂问题通常源于 GPU 和视频控制器之间的不同步操作。为了有效解决这一问题,可以采用以下几种方法: #### 方法一:三缓冲机制 通过引入第三个缓冲区来扩展传统的双缓冲技术,从而减少画面撕裂的可能性。在这种情况下,即使视频控制器正在读取当前帧的一半内容,GPU 可以继续渲染下一帧至另一个未被使用的缓冲区[^1]。 ```python class TripleBuffering: def __init__(self): self.buffers = [None, None, None] self.current_buffer_index = 0 def render_frame(self, frame_data): next_buffer_index = (self.current_buffer_index + 1) % 3 self.buffers[next_buffer_index] = frame_data self.swap_buffers() def swap_buffers(self): self.current_buffer_index = (self.current_buffer_index + 1) % 3 ``` 这种方法能够显著降低画面撕裂的概率,但由于增加了内存占用和延迟时间,在实际应用中需仔细评估其性能影响。 #### 方法二:垂直同步(VSync) 启用垂直同步功能可强制 GPU 等待显示器刷新完成后才提交新帧数据给帧缓冲区。这一步骤有效地防止了部分旧帧与新帧混合的情况发生,进而消除了画面撕裂现象。 然而需要注意的是,开启 VSync 后可能会带来输入滞后等问题,因此开发者应根据具体需求调整设置。 #### 方法三:异步时间扭曲(Asynchronous Timewarp) 对于虚拟现实设备而言,由于头部转动引起的视觉变化需要即时反馈,单纯依赖传统抗锯齿手段难以满足实时性要求。此时可以考虑运用异步时间扭曲算法——它允许独立于应用程序主线程之外单独处理视角变换计算,并快速更新最终呈现效果而不必等待整个场景重新绘制完毕后再展示出来[^2]。 此策略特别适用于高性能图形渲染环境下的交互体验优化工作当中。 --- ### 总结 针对 Perfetto 的画面撕裂问题,推荐优先尝试实施 **三缓冲机制** 或者激活系统的 **垂直同步选项** 来改善用户体验;而对于某些特殊领域比如 VR 应用,则可能还需要借助更先进的技术如 **异步时间扭曲** 才能达到理想中的流畅程度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值