很多朋友在玩游戏的时候都可能遇到过下图这种画面撕裂的情况。尤其是对于FPS玩家,这种撕裂在迅速转动镜头时非常明显。

不过通常游戏设置里面都会有相应的选项来进行调整,比如是否开启垂直同步,是否启用三级缓冲等,打开之后画面撕裂的问题就会有明显的改善。

除了垂直同步以外,我们在购买的显示器和显卡的时候也可能听说过G-Sync、FreeSync等相关的技术,那么这些概念到底是什么意思?他们又是如何解决画面撕裂的问题呢?

撕裂原因

首先我们需要先从画面刷新的基本原理讲起。对于任何一个显示器,其屏幕画面的更新都不是瞬间完成的,而是要从上到下进行逐行扫描刷新,整个屏幕刷新一次是需要一定时间的。

华为手机支持960fps录制,本地显示器录了一段,可以明显看到逐行更新。

我们常说的60HZ显示器其实表示的是屏幕刷新率,也就是显示器每秒可以更新60次。但单次从第一行扫描到最后一行时间并不需要16.6ms(1s/60),也许5ms就可以搞定。

另一方面,屏幕要显示的画面数据其实来源于GPU的Buffer,而GPU往buffer里面写数据的速度与显示器是无关的。GPU产生帧率与显示器帧率往往不一致,如果不加以同步就必然产生撕裂,简单来说,GPU会在显示器读取buffer时把buffer改成下一帧内容,导致显示器上半屏是后一帧图像,下半屏是前一帧图像。

下面是在apex中关闭垂直同步录的,

可以看到其中有撕裂

双缓冲

双缓冲是显卡的渲染基本特性,GPU会使用两个buffer,每次渲染完后都把画面写入backbuffer。而显示器只从frontbuffer读取画面,通过交换指针来交换两个buffer,这个操作可认为是瞬间完成的。

不过swapbuffer时,显示器还没读取完frontbuffer,依然会产生撕裂。

垂直同步

双缓冲下,想要不撕裂,就需要保证显示器在显示完一个buffer后,再去swapbuffer,这就是垂直同步。简单讲,就是显示器在显示完后会向显卡发送一个v-sync信号。

不过垂直同步有两个明显的的缺点:

1.锁帧,这会把游戏帧率限制到显示器帧率。比如你使用的是60帧的显示器,那么无论你使用的是I9的CPU还是4090的显卡,在fps游戏中,玩家操作依然会有明显的延迟。比如下面情况(使用unrealInsight工具进行性能分析),开垂直同步锁了60帧之后,会发现CPU一直都在idle。

2.降帧。当GPU帧率低于60帧,或突然下降时,比如45帧,最终显示的帧率会变成30帧。

关于第2点,我们再进一步分析一下

理想情况:GPU输出帧率高于60帧,输出一帧画面后等v-sync信号,最终显示器顺序输出每帧图像

帧率低的时候:当游戏卡了一下,GPU不能在16.6ms内完成一帧时,显示器产生v-sync信号后,发现没新数据,下一帧就继续使用老数据,导致两次显示了同一帧。再等到下一个v-sync信号,GPU输出了第三帧画面,正常显示,我们会发现中间的第二帧画面丢失了。

另外考虑如果GPU稳定以45帧输出画面,那么每两个v-sync信号只有一个会显示新画面,最终显示器输出的是30帧。

三缓冲

对于低帧率和帧率波动情况,可以用三缓冲来缓解,当帧率高于显示器帧率时,依然是垂直同步锁帧方案。

可以再加一个backbuffer,让GPU在完成一帧后不等垂直同步信号,接着运行,把数据写入另一个backbuffer。当swapbuffer时,顺序选取下一个buffer,相当于多了一个蓄水池。

比如上图,GPU错过了第二个v-sync信号,就把图像缓存起来,第三个v-sync信号时就能显示第二帧图像了。

这里注意,注意GPU每帧输出的图像都必须顺序显示,中间不能丢。而且第一次GPU遇到卡顿的时候是无法避免丢失的,因为那个时候另一个backbuffer里面还没有东西。

这样偶尔有一帧卡,因为多了个缓冲,依然能以60hz输出图像给显示器。当GPU稳定45帧运行时,显示器也能以45帧输出图像,而不是30帧。

但这样也存在问题,帧的逻辑时间可能长短不一,但最终都以16.6ms间隔显示在屏幕上,想象一个匀速直线运动物体,前一帧移动了16ms的距离,后一帧移动了26ms的距离,那么反映到显示器上物体移动就不匀速了。目前看,这种情况无法避免,因为GPU输出的画面是对游戏世界的离散采样,只有让帧率足够高,才能缓解这种问题。

Apex里的垂直同步选项里可选双缓冲和三缓冲,而且解释也比较清楚。

另外三缓冲不是游戏独有的技术,普通软件也能使用。安卓早期UI不流畅,因此在Project Butter中引入了vsync和三缓冲,app都可以使用该特性,也可以用开关mLayerTripleBufferingDisabled进行控制。

Android 之 Project Butter 详细介绍

https://www.jianshu.com/p/aea19baa3608

可变帧率显示器 G-sync Freesync

可变帧率显示器就是freesync和G-Sync技术,分别是AMD和英伟达的技术,要有对应显卡来让显示器帧率与GPU输出画面帧率同步。比如GPU在某段时刻的帧率分别是50,51,57,那么显示器也会立刻改变自己的显示帧率。这样可以做到延迟最低,也不会撕裂。那这个时候是不是还需要开启垂直同步呢?

开垂直同步

帧率依然会限制在屏幕最高帧率,只是GPU画面不需要等v-sync信号,显示延迟更低。

关垂直同步

不锁帧,GPU帧率低于显示器最高帧率时,也不会撕裂,GPU帧率高于显示器帧率,还会撕裂。

因此只要GPU帧率低于显示器帧率,垂直同步开关没影响,都是不撕裂+立即显示,就看游戏能不能跑到更高帧率了。

找了一台支持G-Sync的144hz显示器,关闭垂直同步,游戏稳定100hz左右,确实一直处于流畅状态,也没有撕裂。

FastSync/EnhancedSync

有没有办法在普通显示器上也实现既高帧率,又不撕裂?可以,回顾三缓冲方案,如果GPU帧率很高,可以在两次v-sync间输出两帧,那么就写入两个backbuffer,下一次v-sync来时,选取最新的backbuffer即可,另一个丢弃。这样就既开启了垂直同步,又不锁60帧,能尽快显示最新的画面。这种方式不妨称为FastSync。

这么做输入延迟高于关掉v-sync,但低于开v-sync,很适合fps游戏。

不过依然有最高帧率限制,在两次v-sync间如果把backbuffer都写满了,还是要等,最高帧率为(backbuffer数*显示器帧率)。假如一个游戏backbuffer开了3个,对于普通玩家的60帧显示器,最高帧率可以到达180,也基本够用了。

在虚幻引擎中,r.D3D12.UseAllowTearing和r.D3D12.SwapChainBufferCount分别控制了是否开启FastSync和backbuffer的数量。

映射到对DX接口的操作在这里

如果使用了这种方式,注意开启防撕裂时要关闭垂直同步。

建议

  • 如果只是普通显示器,而且GPU帧率是显示器帧率的2倍或3倍,就使用FastSync/EnhancedSync。

  • 如果显示器支持freesync或G-Sync,fps游戏就不开垂直同步了。

  • 尽量不要使用双缓冲的v-sync,用三缓冲的。

参考:
Android 之 Project Butter 详细介绍:https://www.jianshu.com/p/aea19baa3608
什么是画面撕裂?垂直同步,G-sync,Freesync到底有啥用?:https://zhuanlan.zhihu.com/p/41848908
AMD:https://www.hardwaretimes.com/what-is-v-sync-should-you-turn-it-on-or-off/
垂直同步到底要不要开?:https://www.bilibili.com/video/BV16x411e7bp/

 往期文章推荐 

游戏开发技术系列【想做游戏开发,我应该会点啥?】

虚幻引擎技术系列【使用虚幻引擎4年,我想再谈谈他的网络架构】

游戏科普系列【盘点游戏中那些“欺骗玩家眼睛的开发技巧”】

C++面试系列【史上最全的C++/游戏开发面试经验总结】

我是Jerish,网易游戏工程师,6年从业经验。该公众号会定期输出技术干货和游戏科普的文章,关注我回复关键字可以获取游戏开发、操作系统、面试、C++、游戏设计等相关书籍和参考资料。

为什么游戏画面会产生撕裂?垂直同步与防撕裂技术分析相关推荐

  1. 游戏画面的印象判断价值和审美属性分析

    之前Quora有个问题对于一款游戏谁扮演了更重要的角色(假定的三个选项,游戏设计师.美术和程序员),在几个有针对性的回复中,游戏设计师(Alexander Galasso.Pano Anthos和Pa ...

  2. Unity游戏画面参数解析与应用:垂直同步、动态模糊、抗锯齿

    前言 最近会在B站刷到一些关于 30帧暴涨90帧! 高 中 低端显卡运行3A大作优化指南[干货向] 游戏画质设置教程 等等这样关于画面与性能调整的的视频,看完之后受益良多,UP主们经过实际测试获取到宝 ...

  3. 解决游戏画面撕裂问题谁家显示器更强?

    [摘要]NVIDIA G-Sync和AMD Free Sync之争将是2015年显示器市场的一大亮点,它们都需要显卡和专用显示器支持,从而实现智能刷新率调节. 腾讯数码讯(编译:Lotus)不论是NV ...

  4. android游戏画面抖动,抖音游戏主播是怎么直播手机画面的?

    抖音游戏主播是怎么直播手机画面的? 一直以来,很多人都有这样的疑问,如何在抖音上直播自己的手机画面呢?或者说,如何在抖音上直播游戏呢?比如像下面这样的? 当然,也有很多人问,什么样的推送工具可以用于抖 ...

  5. 每秒处理240万帧游戏画面,AI训练成本降低80%,谷歌开源RL并行计算框架

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI 对土豪来说最痛苦的是什么,就是有一大堆硬件却不能实现1+1=2的效果. AI训练中的并行计算就是如此,纵使你有一千张GPU,也无法实现单机 ...

  6. 3D或游戏画面卡顿的解决方法

    游戏画面及3D对显卡运行能力有要求,所以要关注电脑GPU情况,在高负荷运转情况下,CPU可能正常,但是GPU可能一直处于几乎100%的状态,如图: 所以需要去释放GPU占用资源. 操作步骤: 1.按w ...

  7. 使用YOLOv3(Python - Keras)实时检测屏幕画面进行目标检测教程(以检测GTA5游戏画面为例子)

    毕业设计项目做了一个在游戏GTA5中实现自动驾驶的项目,其中一个功能是汽车的碰撞检测.为了实现这个功能我首先需要能实现识别汽车,对比了使用了SSD和Faster-RCNN,我选择了YOLOv3来实现这 ...

  8. OBS录屏软件无法打开的问题,无法捕获到游戏画面的问题

    obs无法打开,提示缺少dll文件,下载directx修复工具: 地址 使用游戏源,无法捕捉到游戏画面 1.使用管理员身份运行obs和游戏 2.切换游戏渲染模式:opengl.D3D.或者软件渲染

  9. 【Visual C++】游戏开发笔记之六——游戏画面绘图(三)透明特效的制作方法

    本系列文章由zhmxy555编写,转载请注明出处.  http://blog.csdn.net/zhmxy555/article/details/7338082 作者:毛星云    邮箱: happy ...

最新文章

  1. 解决SpringMvc后台接收json数据中文乱码问题
  2. CCNP路由实验---12、配置分发列表和被动接口
  3. springboot项目访问不到controller方法。
  4. 微课|中学生可以这样学Python(8.4节):递归算法例题讲解1
  5. 提升精度或者训练损失不继续下降办法汇总,(进一步提升效果)
  6. 微信推送封面尺寸_微信公众号文章封面图尺寸应该是多大?
  7. R语言select()filter()subset()筛选函数
  8. WorldPress中文乱码问题
  9. 恐怕你确定自己喜欢做什么
  10. My python learning
  11. 简单说说 RPC 框架,你 悟到了吗?
  12. html+css+js适合前端小白的实战全解(超详细)——2048小游戏(三)
  13. 搭建一个自定义的工作流管理平台(一)
  14. 首度基因lims(实验室)管理系统
  15. 当首汽约车携手AWS,出行服务行业会发生怎样的改变?
  16. sv基础-数据类型(一)
  17. 【Unity】关于 InputManager 以及改键功能的制作
  18. 2019福建高中计算机会考操作,2019年福建省普通高中学生学业基础会考.doc
  19. linux下u盘网卡驱动,通过u盘给linux安装网卡驱动的做法——深圳培训linux
  20. 2019如何成为一个优秀的程序员

热门文章

  1. ios APP屏幕快照尺寸
  2. 云计算成未来发展主推动力,关于IaaS未来发展的四个猜想 | 燕麦企业云盘
  3. C#,斐波那契数列(Fibonacci Sequence)的八种算法与源代码
  4. 宠物医院微信小程序的开发与实现
  5. sublime text3安装emmet插件及PyV8:小白重试了n次后终于成功
  6. vue实现计算平均分
  7. 关于(nID 0xFFF0) == IDM_ABOUTBOX的思考
  8. cocos creator 发布IOS版本(六)内购
  9. 简单理解什么是同步阻塞/同步非阻塞,异步阻塞/异步非阻塞
  10. 苹果手表3和4的区别_一个传统手表用户的叛逃!我就爱用Apple Watch 5看时间