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。文章来源:https://www.toymoban.com/news/detail-416941.html
vsync off
这里也带来了个新能力,就是在windowed mode下可以关闭vsync(传统显示器是做不到的)。
在显示器,GPU驱动,windows版本都ok的情况下,app内部显示可以支持vsync off(dx12下叫DXGI_PRESENT_ALLOW_TEARING)。
我们在windowed mode(也包括borderless fullscreen)下就可以关闭vsync,获得一个更好的刷新率文章来源地址https://www.toymoban.com/news/detail-416941.html
reference
- DXGI flip model
- For best performance, use DXGI flip model
- Variable refresh rate displays
- Nvidia G SyncMonitors
到了这里,关于[dx12]Flip, VSync 和 GSync的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!