[dx12]Flip, VSync 和 GSync

news/2023/11/29 6:28:11

在这里插入图片描述

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

  • DXGI flip model
  • For best performance, use DXGI flip model
  • Variable refresh rate displays
  • Nvidia G SyncMonitors

http://www.ppmy.cn/news/682658.html

相关文章

DX12渲染引擎目录

DX12渲染引擎(零)开篇 - 知乎https://zhuanlan.zhihu.com/p/499521948DX12渲染引擎(一)创建项目 - 知乎https://zhuanlan.zhihu.com/p/499537362DX12渲染引擎(二)创建窗口 - 知乎https://zhuanlan.zhihu.co…

DX12窗口

#include<Windows.h> #define WINDOWTITLE L"致我们永不熄灭的游戏开发梦想~" #define WINDOW_WIDTH 800 #define WINDOW_HEIGHT 600 //----------------begin----------------- float g_posX 0; float g_posY 0; LRESULT CALLBACK WndProc(HWND hwnd, UIN…

DAZ STUDIO 4.12 NVIDIA Iray 渲染设置

DAZ STUDIO 4.12 NVIDIA Iray渲染设置 目录General 常规设置Render Mode 渲染模式Progressive Rendering 渐进式渲染Alpha 阿尔法设置Optimization Tab Settings 优化选项卡设置Filtering 滤波器设定Spectral Rendering 光谱渲染Tone Mapping 色调映射器Environment 环境光设置…

支持DX12的DeepFaceLab(DeepFake)新版本除了CUDA也可以用A卡啦

DeepFaceLab相关文章 一&#xff1a;《简单介绍DeepFaceLab&#xff08;DeepFake&#xff09;的使用以及容易被忽略的事项》 二&#xff1a;《继续聊聊DeepFaceLab&#xff08;DeepFake&#xff09;不断演进的2.0版本》 三&#xff1a;《如何翻译DeepFaceLab&#xff08;DeepF…

[技美CG][DX12实战]Demo 运行【DX12】【VS2022】【龙书】【新手开箱可用】

DirectX12 3D 游戏开发实践 Demo 运行 前言官方网站运行官方demo1.安装vs20222.如图解压Common文件夹和MyD3D12Project到本地3.解压后如图4.打开解决方案5.debug运行6.运行结果7.遇到问题解决:提示应用程序请求的操作依赖于已缺失或不匹配的 SDK 组件![在这里插入图片描述](htt…

Apache Doris (十四) :聚合模型的局限性、模型选择建议及列定义建议

目录 1. 聚合模型的局限性 2.数据模型的选择建议 2.1 Aggregate数据模型选择 ​​​​​​​​​​​​​​2.2 Unique数据模型选择 ​​​​​​​​​​​​​​2.3 Duplicate数据模型选择 ​​​​​​​3. 列定义建议 进入正文之前&#xff0c;欢迎订阅专题、对博文点…

Xilinx ZYNQ系列10款型号IDCODE汇总(2023年7月最新版)

ZYNQ系列产品选型手册&#xff1a;zynq-7000-product-selection-guide /* Zynq Devices. */ #define IDCODE_XC7Z007 0x03723093 #define IDCODE_XC7Z010 0x03722093 #define IDCODE_XC7Z012 0x0373C093 #define IDCODE_XC7Z014 0x03728093 #defi…

1e6等于多少?

如果抽象成这样:aeb 要求a不能不写,也就是说是1也要写上 b必须是整数. 实现上就是 a*10^b a乘以10的b次方 所以楼主的就是1*10^6 100000 转载于:https://www.cnblogs.com/aliwa/p/6559682.html

rem等于多少px?

rem就是根元素的字体大小单位。 <html style"font-size:250px"> 在根标签设置字体大小为250px&#xff0c;1rem250px,2rem500px

Java - Math.round(1.5) 等于多少?Math.round(-1.5) 等于多少?

分享一个大牛的人工智能教程。零基础&#xff01;通俗易懂&#xff01;风趣幽默&#xff01;希望你也加入到人工智能的队伍中来&#xff01;请点击人工智能教程 Math.round(1.5)的返回值是2&#xff0c;Math.round(-1.5)的返回值是-1。四舍五入的原理是在参数上加0.5然后做向下…

mpa和pis_1psia等于多少mpa

1MPa 等于多少公斤压力在阀门管件行业中,根据公称压力 PN 的大小,我们可以把公称压力小于等 于 1.6MPa 的阀门为低压阀门,公称压力为 2.5MPa、4.0MPa、6.4MPa 的...... 工程上MPa与公斤的关系_建筑/土木_工程科技_专业资料。1、 1 公斤产生的压强有多大? 工程上常说的多少公斤…

电子学理论基础

1.电压、电流与电阻 1.1 电压与电流 电压(符号:V,有时用E表示) 两点之间的电压就是将单位正电荷从低电位点搬移到高电位点所做的功(损耗的能量)。 电压又称为电势差或电动势(EMF),其单位是伏特。 1kV=1000V; 1V=1000mV; 1mV=1000uV 移动1C(库仑)电荷通过1V的电位…

【leetcode】198. 打家劫舍

你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个房屋存放金额的非…

初学nacos总结

1、服务雪崩&#xff1a;所有的实例都不可用 2、雪崩保护 保护阈值&#xff1a;0-1 就是百分比 与实例有关 健康实例数/总实例数<保护阈值 会把不健康的实例拿出来用&#xff0c;这就是雪崩保护 3、实例&#xff1a;永久实例 临时实例 临时实例&#xff1a;spring.cloud.n…

不到3000块,搭建IT人的实验平台!性能可媲美服务器!

作为IT从业者&#xff0c;特别是运维这个岗位&#xff0c;没有自己的实验平台真的特别难受&#xff0c;那么如何搭建自己的实验平台呢&#xff1f;这是我最近思考并付诸实践的一个事情&#xff0c;最终找到了自己觉得比较可以的方案。 01 我的需求是什么&#xff1f; 大内存容量…

服务器虚拟化解锁方案,RX 5700乐成刷入RX 5700 XT BIOS:频率、功耗双双解锁

AMD处理惩罚器、显卡历史上曾屡屡被“开核”&#xff0c;如今处理惩罚器没得玩儿了&#xff0c;但是显卡却时不时带来惊喜&#xff0c;好比RX 460打开全部1024个流处理惩罚器&#xff0c;好比Vega 56性能大涨&#xff0c;好比RX 480特别得到4GB GDDR5显存。 此刻&#xff0c;RX…

Redis的五种数据类型

Redis支持五种数据类型&#xff1a;string&#xff08;字符串&#xff09;&#xff0c;hash&#xff08;哈希&#xff09;&#xff0c;list&#xff08;列表&#xff09;&#xff0c;set&#xff08;集合&#xff09;及zset&#xff08;sorted set&#xff1a;有 序集合&#x…

多线程中的可见性

一、Java 内存模型 JMM&#xff08;Java Memory Model&#xff09;&#xff1a;Java 内存模型&#xff0c;是 Java 虚拟机规范中所定义的一种内存模型&#xff0c;Java 内存模型是标准化的&#xff0c;屏蔽掉了底层不同计算机的区别。也就是说&#xff0c;JMM 是 JVM 中定义的…

macpro台式计算机,被工业设计震撼,Mac pro 垃圾桶升级

被工业设计震撼,Mac pro 垃圾桶升级 2019-01-03 19:40:00 187点赞 426收藏 181评论 升级理由 MAC PRO购于2013年,至今已使用五年有余,最低配,E5-1620V2+16G内存+256SSD+双AMD FirePro D300,主要用于LR和PS以及PR。几年使用下来从来没有出现过罢工的情况,是实实在在的生产…

C++检测平面内两个三角形是否相交(逻辑清晰,手撕精简版)

看了很多博客对这个问题都写的逻辑混乱&#xff0c;还漏掉了某些情况&#xff0c;实在看不下去了。所以本人按自己对几何的理解手写了一版&#xff0c;可能并不是最优解法&#xff0c;但是力求简洁&#xff0c;百行之内完成任务。 1 理论部分 1.1 两个三角形a,b存在三种关系&…
最新文章