Vulkan 绘制显示设计
背景
众所周知,Vulkan是个跨平台的图形渲染API,为了友好地支持跨平台,Vulkan自然也抽象出了很多接口层去对接各个操作系统,抹平系统间的差异,Swap Chains即为WSI。
其本质上是一种图像队列,此队列会按顺序依次将队列中的若干图形显示在屏幕上。我们的应用程序需要获得这个队列中的图像,并在此图像中执行绘制操作,绘制完毕以后,将它重新放置到原来的队列中,类似Android的Graphic Buffer Queue。
swap chain 的常规作用是保障图形显示与幕刷新率同步。
Swap Chain Support
Vulkan支持的平台众多,也不是所有的平台都具备将(渲染出来的)图像直接显示在屏幕上的功能,有些以计算为目的应用是不需要把绘制的结果呈现给用户。所以显示相关的API并不是Vulkan核心API的一部分,而是通过扩展(extensions)的方式提供。
因此在查询到当前运行环境对 swap chain 的支持情况之后,你需要明确启用 VK_KHR_swapchain 所代表的设备扩展功能。注意,Vulkan头文件中提供了宏定义 VK_KHR_SWAPCHAIN_EXTENSION_NAME ,它定义了 VK_KHR_swapchain(一种swap chain的实现)。使用这个宏定义的优势在于,编译或(编辑)过程中编译器可以直接检查出拼写错误(如果直接使用字符串 "VK_KHR_swapchain" 则无法让编译器去检查拼写错误)。
Enabling device extensions
启动一个swap chain对象首先要启用 VK_KHR_swapchain 扩展。需要在设备创建过程中开启:

Querying details of swap chain support
前面我们检测了当前设备是否支持swap chain,但由于设备对Vulkan支持的碎片化导致了我们还需要更多的检查才能保证正常的绘制显示。有三种基础属性,我们需要检查:
- 基本的对象能力(swap chain 中图像数量的最大最小值,图像宽或高的最大最小值)
-
表面格式(像素数据格式,色彩空间)
-
显示模式

每个属性都有各自的特点,今天重点分析下显示模式这一方面,其他的后续有机会再详说。
显示模式
显示模式是 swap chain 功能中最核心的特性,也是设计swap chain的初衷,因为它直接关系到图像如何送显。
在OpenGL中当完成对缓冲区的渲染后,需要使用前缓冲区切换图像,可以将渲染好的图像显示在计算机屏幕上。我们只能决定是否在空白间隔显示图像(在启用了垂直同步的情况下)。
在Vulkan中我们不会受限于只能渲染一幅图像(存储在后备缓冲区中的),而且也不会受限于只能在两种显示模式(启用或禁用垂直同步)中进行选择。我们可以在多种显示模式中进行选择,但我们需要在创建交换链的过程中设定该显示模式。
在Vulcan中获取所需场景的显示模式流程如下:
- 调用vkEnumeratePhysicalDevices()函数获取物理句柄
-
获取已创建的显示曲面,将该显示曲面的句柄存储在一个VkSurfaceKHR类型的变量中
-
创建一个VkPresentModeKHR类型的变量,将其命名为desired_present_mode。将想要使用的显示模式存储在这个变量中,用于存储显示模式
-
创建一个uint32_t类型的变量,用于存储设备支持的显示模式。
-
调用vkGetPhysicalDeviceSurfacePresentModesKHR,如果成功则获得该设备支持的显示模式数量
-
创建std::vector<VkPresentModeKHR>,再调vkGetPhysicalDeviceSurfacePresentModesKHR,若返回VK_SUCCESS表示集合里包含了设备支持的显示模式类型
-
匹配需要的显示模式,未匹配则可选用FIFO显示模式,因其是必备选项。
IMMEDIATE
应用提交的图像(数据) 立即被转移到屏幕,因该模式下无缓冲队列,也不会等待Vsync的触发,所以可能会产生显示屏幕中的画面撕裂现象。

FIFO
每个Vulkan API的实现都必须支持FIFO模式。在使用这种模式的情况下,当显示图像时,该图像会被添加到FIFO队列,该队列的长度等于交换链中图像的总数减一。通过使用这种队列,图像能够以与空白时间同步的方式(垂直同步)在计算机屏幕上显示,其被显示的次序永远会与其被添加到队列中的次序相同,刷新显示的时刻叫做"垂直空白"。这种显示模式中不会出现画面撕裂,因为启用了垂直同步功能。这种模式与OpenGL中将交换间隔设置为1的缓冲区交换模式类似。
FIFO Relax
在FIFO上做了修改,当图像的显示时长超过一个vsync周期时,下一个图像不会再等待下一次vsync的到来,而是立刻显示。如果显示速度足够快,就不会出现画面撕裂,但如果我们编写的应用程序的绘图速度低于显示器的刷新频率,就会出现画面撕裂。该行为与OpenGL中EXT_swap_control_tear扩展设置的行为类似。

MAILBOX
可以将其视为三缓冲区显示模式。这种显示模式会使用一个队列,但该队列仅会含有一个元素。该队列中的图像会通过与空白间隔同步的方式在屏幕上显示(在启用了垂直同步的情况下)。但是当应用程序显示图像时,新图像会替换队列中的图像。因此,显示引擎总是会显示最后一个、最新的可用图像,而这种显示模式不会出现画面撕裂。

总结
本文主要分析了Vulkan绘制显示部分的基础架构--swap chain的设计、兼容性,并分析了其中重要的属性-显示模式的各种特性,至于其他的特性后续有机会再分析。我们可以看到Vulkan在显示部分也有更丰富的场景支持和更自由的选择权供应用选择。
相关文章:
Vulkan 绘制显示设计
背景 众所周知,Vulkan是个跨平台的图形渲染API,为了友好地支持跨平台,Vulkan自然也抽象出了很多接口层去对接各个操作系统,抹平系统间的差异,Swap Chains即为WSI。 其本质上是一种图像队列,此队列会按顺序…...
Linux性能分析工具介绍(一)--cpu及功耗相关工具介绍
目录 一、引言 二、CPU及功耗分析工具介绍 ------>2.1、cpuinfo ------------>2.1.1、cpuid指令 ------>2.2、lscpu ------>2.3、turbostat ------>2.4、rdmsr ------>2.5、mpstat ------>2.6、/proc/stat ------>2.7、powertop ----------…...
智能财务分析的无冕之王-奥威BI数据可视化工具
利用智能数据可视化分析工具,可极大提升财务分析效率和报表可读性,缩短从分析到决策的耗时。但财务分析的难度往往比其他分析更高,因为它的分析指标计算组合变化太多也太快。哪些数据可视化工具能胜任智能财务数据分析? 奥威BI数…...
.NET 应用程序 部署
**硬件支持型号 点击 查看 硬件支持 详情** DTU701 产品详情 DTU702 产品详情 DTU801 产品详情 DTU802 产品详情 DTU902 产品详情 G5501 产品详情 本文内容 在设备上部署 dotnet应用,与任何其他平台的部署相同,可以2种方式: 依赖于框…...
Linux CentOS安装NVIDIA GPU驱动程序和NVIDIA CUDA工具包
要在CentOS上安装NVIDIA驱动程序和NVIDIA CUDA工具包,您可以按照以下步骤进行操作: 1. 准备工作: 确保您的系统具有兼容的NVIDIA GPU。您可以在NVIDIA官方网站上查找支持CUDA的GPU型号列表。如果您之前已经安装了Nouveau驱动程序并禁用了它…...
剑指Offer13.机器人的运动范围 C++
1、题目描述 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的…...
List、Map、Set打印
List List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。 普通[1,2] 1.循环 2.System.out.println(list); int数组[1,2,3,4,5,6,1,2,3] 1.for (int[] array : list)…...
软件机器人在渔业船员证书核发中自动化二次审批制证,提高效率和准确性
近年来,随着科技的不断进步,自动化软件机器人在各个领域得到了广泛应用。在渔业船员证书核发事项中,传统的审批和制证流程相对繁琐。博为小帮软件机器人可以让这一流程变得更加高效和准确。 在过去,渔业船员证书核发事项需要在省级…...
Godot4 C# vscode开发环境搭建
用vscode搭建Godot4 C# 开发环境搭建 软件Godot配置vscode配置结果参考 软件 Godot .Net版本: 下载链接vscode :自行下载.netcore7:.netcore6可能也行vscode插件: Godot配置 1.配置文件用VSCode打开 2.生成C#项目 项目–>工具–>C#->Creat…...
nginx简介与安装配置,目录结构和配置文件介绍
一.nginx简介 1.简介 2.特性 二.nginx安装 1.rpm包方式 (1)下载扩展源 (2)安装扩展rpm包,nginx -V查看配置参数,后面源码安装时要用到 2.源码方式 (1)建议提前下好所需要的部…...
CTF流量题解http4.pcapng
流量分析 导出http 打开报错 验证文件头,发现是zip。 图常片见里文可件能的包16含进:压制缩头包部,word,pdf JPG FF D8 FF E0/FF D8 FF E1 PNG 89 50 4E 47 GIF 47 49 46 38 ZIP 50 4B 03 04 RAR 52 61 72 21 MP3 49 44 33 0 改后缀 使用工具爆破。 git clone git…...
旷视科技AIoT软硬一体化走向深处,生态和大模型成为“两翼”?
齐奏AI交响曲的当下,赛道玩家各自精彩。其中,被称作AI四小龙的商汤科技、云从科技、依图科技、旷视科技已成长为业内标杆,并积极追赶新浪潮。无论是涌向二级市场还是布局最新风口大模型,AI四小龙谁都不甘其后。 以深耕AIoT软硬一…...
STM32 F103C8T6学习笔记2:GPIO的认识—GPIO的基本输入输出—点亮一个LED
今日继续学习使用 STM32 F103C8T6开发板 点亮一个LED灯,文章提供源码,测试工程,实验效果图,希望我的归纳总结会对大家有帮助~ 目录 GPIO的认识与分类 : 引脚安排整理: 定时器的引脚例举: …...
数组相关练习
数组练习 将数组转化成字符串数组拷贝求数组元素的平均值查找数组中指定元素(顺序查找)二分查找冒泡排序数组逆序 将数组转化成字符串 import java.util.Arrays;public class Text1 {public static void main(String[] args) {int[] arr {5, 6, 4, 2};System.out.println(Arr…...
Leetcode-每日一题【剑指 Offer 11. 旋转数组的最小数字】
题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4…...
git教程(第一次使用)
一、gitee和github区别 二、git使用 下载地址 windows:https://gitforwindows.org/ mac:http://sourceforge.net/projects/git-osx-installer/ 1.git初次运行前的配置 (1)配置用户信息 git config --global user.name "…...
Autoware.ai1.14.0自动驾驶-Demo运行
Autoware.ai1.14.0自动驾驶-Demo运行 数据准备 下载数据: wget https://autoware-ai.s3.us-east-2.amazonaws.com/sample_moriyama_data.tar.gz wget https://autoware-ai.s3.us-east-2.amazonaws.com/sample_moriyama_150324.tar.gz一定要注意解压文件是在.auto…...
AttributeConverter
AttributeConverter 是 JPA 中的一个接口,,用于实体属性和 数据库字段,,之间的转换,,,类似mybatis中的typeHandler AttributeConverter使用 定义一个类实现AttributeConverter接口,…...
【逗老师的PMP学习笔记】8、项目质量管理
目录 一、规划质量管理1、质量管理的发展历史2、戴明环,PDCA理论3、【关键输入】事业环境因素4、【关键输入】成本效益分析5、【关键工具】质量成本6、【关键输出】质量管理计划7、插一嘴,项目的三个标准8、【关键工具】质量测量指标 二、管理质量1、【关…...
Zookeeper集群
目录 一、Zookeeper 概述 1)Zookeeper 定义 2)Zookeeper 工作机制 3)Zookeeper 特点 4)Zookeeper 数据结构 5)Zookeeper 应用场景 6)Zookeeper 选举机制 ●第一次启动选举机制 ●非第一次启动选举机…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
