• [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

  • 相关阅读:
    中项系统集成项目管理2023上半年真题及解析
    影响 SEO 的排名优化的因素
    JS-String篇(速记用法大汇总)
    Java基础(上)
    redis学习笔记
    近邻法总结
    Java项目:SSM邮件收发管理系统
    jmeter压测报错:java.net.SocketException: Connection reset
    联影医疗通过注册:拟募资125亿 薛敏控制32%股权
    如何使用HTML制作个人网站( web期末大作业)
  • 原文地址:https://blog.csdn.net/ccanan/article/details/126571709