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 选举机制 ●第一次启动选举机制 ●非第一次启动选举机…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
