[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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值