[dx12]Flip, VSync 和 GSync

Posted 安柏霖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[dx12]Flip, VSync 和 GSync相关的知识,希望对你有一定的参考价值。

windows平台上,vsync和flip常常是一个剪不断理还乱的东西,时不时就会有新的问题处理;
而且随着时代的发展,概念也在不停地演变,包括

  • win8 开始的flip mode present(取代之前的blit mode present)
  • 15年开始,后来逐步普及的variable refresh rate显示器(ps5&xbox, nvidia的gsync, amd的freesync)

这里我们就常用的windows平台上的情况做一个记录

blit mode present & flip mode present

app surface & desktop

exclusive fullscreen:

这种情况下,系统会直接把app surface显示到屏幕上,中间也不会有blit等操作,最简单

windowed mode(包括borderless widnow)

这时候dwm(desktop window manager)要做一个composition工作(和其他的app的surface),这里就有两个选择

  • blt mode present : 通过一个blit复制过去,在合成
  • flip mode present : 直接合成:显然这个更好高于

vsync

基本概念就是,如果画面输出在显示器刷新一半的时候,那么就会造成撕裂;
常规解决办法就是app等待显示器刷新完毕,再更新surface,这样就没有撕裂

  • 优点:不撕裂
  • 缺点:更多的等待时间,帧数不够高,输入延迟高

exclusive fullscreen下的vsync

这里app直接output输出,所以我们可以选择开启或者关闭vsync,关了vsync画面就会撕裂了。

windowed mode下的vsync

windowed mode下的vsync:由于整个屏幕是由dwm来全权管理的,所以vsync是强制开启的,这里是底层present可以任意present,游戏帧数也可以跑到高于屏幕刷新率,但是dwm在这里会做vsync的操作,所以开关vsync都不会有vsync带来的屏幕撕裂的问题

variable refresh rate displays

15年开始,GSync的概念开始走起,近几年的显示器普遍开始支持了,就是显示器可以根据app的输出频率来做刷新,所以显示器刷新可能是56,87这种(当然不能高于其自己刷新率极限)。
这样的话,app就不用等了,好了就输出,然后显示器随之刷新,就把传统vsync等待时间给降到最低,改进了input lag。

vsync off

这里也带来了个新能力,就是在windowed mode下可以关闭vsync(传统显示器是做不到的)。
在显示器,GPU驱动,windows版本都ok的情况下,app内部显示可以支持vsync off(dx12下叫DXGI_PRESENT_ALLOW_TEARING)。
我们在windowed mode(也包括borderless fullscreen)下就可以关闭vsync,获得一个更好的刷新率

reference

以上是关于[dx12]Flip, VSync 和 GSync的主要内容,如果未能解决你的问题,请参考以下文章

[dx12]Flip, VSync 和 GSync

outlook无法启动提示MAPI无法加载信息服务gsync.dll

Linux 帧缓冲图形和 VSync

dx12环境是啥意思

全境封锁支持DirectX 12,对比DX11性能提升多少

DX12是啥显卡?DX12是啥意思?