这个系列文章我们来介绍一位海外工程师如何探索 Vulkan 音视频技术,对于想要开始学习音视频技术的朋友,这些文章是份不错的入门资料,本篇介绍 Vulkan 架构概述。
——来自公众号“关键帧Keyframe”的分享
SaschaWillems/Vulkan 仓库是一套全面的开源 C++ 示例合集,展示了 Vulkan 图形与计算 API 的功能。本架构概览将帮助你理解该框架的结构,以及其组件如何协同工作,从而创建高效、跨平台的 Vulkan 应用程序。
该框架围绕模块化设计构建,既抽象了常见的 Vulkan 操作,又保留了 Vulkan 提供的底层控制。它采用分层方法,复杂功能构建于更简单的组件之上,使其更易于理解和扩展。
该架构的设计目标是:
- 跨平台:支持 Windows、Linux、Android、iOS 和 macOS
- 教育性:每个示例都展示特定的 Vulkan 功能
- 模块化:核心功能被分离到可复用的组件中
- 可扩展:易于添加新示例和功能
1、基础框架组件
框架的核心位于 base/ 目录,其中包含处理常见 Vulkan 操作的核心类。这些组件抽象了 Vulkan 应用所需的样板代码,同时保持灵活性。
1.1、VulkanExampleBase 类
VulkanExampleBase 类是框架的基石,为 Vulkan 示例提供完整的应用生命周期。它负责初始化、渲染和清理操作,让开发者专注于示例特定的功能。
其主要职责包括:
- 实例与设备管理:创建并管理 Vulkan 实例和逻辑设备
- 窗口系统集成:处理平台特定的窗口创建和事件处理
- 交换链管理:创建并管理呈现交换链
- 命令缓冲区管理:设置用于渲染的命令池和缓冲区
- 同步:管理用于 GPU-CPU 同步的信号量和栅栏
- 渲染循环:提供基于帧的渲染循环,并带有时序和 FPS 跟踪
该类采用虚函数模式,示例通过重写 render()、buildCommandBuffers() 和 prepare() 等方法来实现特定功能。
来源:vulkanexamplebase.h#L78-L420
1.2、VulkanDevice 类
VulkanDevice 类封装了物理和逻辑 Vulkan 设备,为设备操作提供高级接口。它负责设备选择、队列族管理和内存分配。
其主要特性包括:
- 设备选择:评估并选择合适的物理设备
- 队列管理:识别并访问不同的队列族(图形、计算、传输)
- 内存管理:提供内存类型选择和分配工具
- 缓冲区创建:简化缓冲区创建并自动分配内存
- 扩展支持:检查并启用设备扩展
该类遵循 RAII 模式,确保 Vulkan 资源被正确清理。
来源:VulkanDevice.h#L22-L69
1.3、VulkanSwapChain 类
VulkanSwapChain 类管理呈现交换链,负责将渲染后的图像显示到屏幕。它处理交换链创建和管理的复杂平台特定方面。
其主要职责包括:
- 表面创建:创建窗口系统特定的呈现表面
- 交换链创建:以最优参数设置交换链
- 图像管理:管理交换链图像及其视图
- 呈现:处理图像获取并呈现到屏幕
- 平台支持:支持多个窗口系统(Win32、XCB、Wayland、Android 等)
该类抽象了平台差异,为呈现操作提供统一接口。
来源:VulkanSwapChain.h#L30-L101
1.4、资源管理类
该框架包含多个用于管理 Vulkan 资源的类:
1.4.1、VulkanBuffer
VulkanBuffer 类封装了 Vulkan 缓冲区对象,简化了缓冲区创建、内存分配和数据上传操作。
其主要特性:
- 缓冲区创建:用指定的使用标志创建缓冲区
- 内存管理:分配并绑定设备内存
- 数据传输:映射、更新和刷新缓冲区数据
- 描述符设置:准备缓冲区描述符以供着色器访问
来源:VulkanBuffer.h#L24-L45
1.4.2、VulkanTexture
VulkanTexture 类层次结构处理纹理加载和管理,支持多种纹理类型,包括 2D、2D 数组和立方体贴图。
其主要能力:
- 纹理加载:从文件加载纹理(KTX 格式)
- 图像创建:创建带有适当内存分配的 Vulkan 图像
- Mipmap 生成:自动生成 mipmap
- 采样器创建:创建具有可配置参数的纹理采样器
- 多格式支持:支持各种纹理格式和布局
该类的层次结构包括针对不同纹理类型的专用类:
Texture2D:标准 2D 纹理Texture2DArray:2D 纹理数组TextureCubeMap:用于环境映射的立方体贴图
来源:VulkanTexture.h#L31-L97
2、应用程序架构流程
使用该框架的 Vulkan 应用程序的典型流程遵循一个定义良好的模式:
2.1、初始化阶段
在初始化期间,框架执行以下关键步骤:
- 平台设置:使用平台特定 API 创建原生窗口
- Vulkan 实例:创建带有必要扩展的 Vulkan 实例
- 设备选择:评估可用的物理设备并选择最合适的一个
- 逻辑设备:创建具有所需功能和队列的逻辑设备
- 交换链创建:以最优参数设置呈现交换链
- 资源设置:创建必要的资源,如缓冲区、纹理和渲染通道
2.2、渲染循环
渲染循环遵循以下模式:
3、平台抽象
该框架通过条件编译和平台特定实现提供了出色的平台抽象:
3.1、支持的平台
| 平台 | 实现文件 | 主要特性 |
|---|---|---|
| Windows | vulkanexamplebase.h(Win32 部分) | Win32 API 集成,DPI 感知 |
| Linux | vulkanexamplebase.h(XCB/Wayland 部分) | X11 和 Wayland 支持 |
| Android | VulkanAndroid.h/cpp | Android 原生活动集成 |
| macOS/iOS | apple/ 目录 | 用于 Metal 后端的 MoltenVK 集成 |
平台抽象层处理:
- 窗口创建:平台特定的窗口创建和管理
- 事件处理:输入和窗口事件处理
- 表面创建:平台特定的 Vulkan 表面创建
- 资源管理:平台特定的资源处理
4、示例组织
examples/ 目录包含 100 多个按类别组织的示例:
4.1、基础示例
- 三角形渲染(Vulkan 1.0 和 1.3)
- 管线管理
- 描述符集和布局
- 纹理映射
- 缓冲区管理
4.2、高级技术
- 多重采样
- HDR 渲染
- 阴影映射
- 延迟渲染
- 光线追踪
4.3、特殊功能
- glTF 模型加载和渲染
- 计算着色器
- 几何和细分着色器
- 多线程
每个示例都继承自 VulkanExampleBase,并通过重写虚方法实现特定功能。
5、着色器管理
该框架通过 shaders/ 目录支持多种着色器语言:
- GLSL:主要着色器语言,直接支持 Vulkan
- HLSL:高级着色语言,可交叉编译为 SPIR-V
- Slang:具有高级特性的现代着色语言
着色器在构建时编译为 SPIR-V(标准可移植中间表示),允许在运行时加载而无需编译开销。
6、外部依赖
external/ 目录包含框架使用的第三方库:
- ImGui:用于覆盖层和调试的即时模式 GUI
- glTF:用于加载 3D 模型的 TinyGLTF 库
- KTX:用于加载纹理的 Khronos 纹理格式
- STB:用于加载图像的单文件公共领域库
7、结论
SaschaWillems/Vulkan 框架为学习和开发 Vulkan 应用程序提供了全面、结构良好的基础。其模块化架构、跨平台支持和广泛的示例集,使其成为初学者和经验丰富的 Vulkan 开发者的绝佳资源。
该框架的优势在于它在抽象和控制之间取得了平衡——它处理了样板代码,同时仍允许开发者在需要时访问底层 Vulkan 功能。这使其成为 Vulkan 开发的理想起点,也是理解 Vulkan 最佳实践的宝贵参考。
学习和提升音视频开发技术,推荐你加入我们的知识星球:【关键帧的音视频开发圈】

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。