4
社区成员
发帖
与我相关
我的任务
分享┌─────────────────────────────────────────────────────────────────────┐ │ VULKAN 层次结构 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ 1. VkInstance (实例) │ │ │ │ │ ├──► VkPhysicalDevice (物理设备/GPU) │ │ │ │ │ │ │ ├──► QueueFamily (队列族) │ │ │ │ ├──► Graphics Queue (图形队列) │ │ │ │ ├──► Present Queue (呈现队列) │ │ │ │ ├──► Compute Queue (计算队列) │ │ │ │ └──► Transfer Queue (传输队列) │ │ │ │ │ │ │ ├──► 支持检查 (交换链、扩展、特性) │ │ │ │ │ │ │ └──► VkDevice (逻辑设备) ← 从物理设备创建 │ │ │ │ │ │ │ ├──► VkQueue (实际队列句柄) ← 从队列族获取 │ │ │ │ ├──► graphicsQueue │ │ │ │ └──► presentQueue │ │ │ │ │ │ │ ├──► VkSwapchainKHR (交换链) │ │ │ │ ├──► VkImage (交换链图像) │ │ │ │ └──► VkImageView (图像视图) │ │ │ │ │ │ │ ├──► VkRenderPass (渲染通道) │ │ │ │ │ │ │ ├──► VkPipeline (管线) │ │ │ │ ├──► VkShaderModule (着色器模块) │ │ │ │ └──► VkPipelineLayout (管线布局) │ │ │ │ │ │ │ ├──► VkCommandPool (命令池) │ │ │ │ └──► VkCommandBuffer (命令缓冲区) │ │ │ │ │ │ │ └──► 同步对象 │ │ │ ├──► VkSemaphore (信号量) │ │ │ └──► VkFence (栅栏) │ │ │ │ │ └──► VkSurfaceKHR (窗口表面) │ │ │ │ │ └──► 用于交换链创建和呈现 │ │ │ └─────────────────────────────────────────────────────────────────────┘
┌────────────────────────────────────────────────────────────────────────┐ │ 创建与选择流程 │ ├────────────────────────────────────────────────────────────────────────┤ │ │ │ ① VkInstance │ │ │ (应用程序与Vulkan驱动之间的连接) │ │ │ │ │ ▼ │ │ ② vkEnumeratePhysicalDevices() │ │ │ (枚举所有GPU) │ │ ▼ │ │ ③ VkPhysicalDevice (选择合适的一个) │ │ │ (GPU硬件) │ │ │ │ │ ├── 检查: findQueueFamilies() │ │ │ └── 需要 Graphics + Present 队列族 │ │ │ │ │ ├── 检查: checkDeviceExtensionSupport() │ │ │ └── 需要 VK_KHR_swapchain 扩展 │ │ │ │ │ └── 检查: querySwapChainSupport() │ │ └── 需要 格式 + 呈现模式 │ │ │ │ ▼ │ │ ④ vkCreateDevice() │ │ │ (从物理设备创建逻辑设备) │ │ ▼ │ │ ⑤ VkDevice │ │ │ (软件接口,用于与GPU交互) │ │ │ │ │ ├── vkGetDeviceQueue() → 获取 VkQueue │ │ │ ├── graphicsQueue (用于提交渲染命令) │ │ │ └── presentQueue (用于呈现图像) │ │ │ │ │ └── 创建其他Vulkan资源... │ │ │ └────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────┐ │ 类比:餐厅 │ ├─────────────────────────────────────────────────────────────────────────┤ │ │ │ VkInstance = 整个餐饮集团的总部 │ │ (连接所有分店,管理全局配置) │ │ │ │ VkPhysicalDevice = 具体的餐厅分店 (GPU硬件) │ │ (有多名厨师,但硬件能力固定) │ │ │ │ QueueFamily = 厨师团队类型 │ │ (有主厨、甜点师、调酒师等) │ │ │ │ VkQueue = 具体的厨师 (从团队中分配的) │ │ (graphicsQueue = 主厨,presentQueue = 服务员) │ │ │ │ VkDevice = 餐厅的运营管理软件 │ │ (调度厨师工作,管理资源) │ │ │ │ 选择过程: │ │ 1. 总部(VkInstance)列出所有分店(物理设备) │ │ 2. 检查每个分店是否有主厨团队(graphics)和服务员(present) │ │ 3. 检查分店是否支持外卖配送(交换链扩展) │ │ 4. 选择最适合的分店 │ │ 5. 签订运营合同(VkDevice)并分配具体人员(VkQueue) │ │ │ └─────────────────────────────────────────────────────────────────────────┘
| 概念 | 关系 | 说明 |
|---|---|---|
| Instance → PhysicalDevice | 1对多 | 一个实例可以管理多个GPU |
| PhysicalDevice → Device | 1对1 | 一个物理设备创建一个逻辑设备 |
| Device → Queue | 1对多 | 一个逻辑设备可以有多个队列 |
| QueueFamily → Queue | 1对多 | 一个队列族可以创建多个队列 |
| Surface → SwapChain | 1对1 | 一个表面对应一个交换链 |
| SwapChain → Image | 1对多 | 一个交换链包含多个图像 |
| Image → ImageView | 1对1 | 每个图像需要一个视图来使用 |
| Device → Pipeline | 1对多 | 一个设备可以创建多个管线 |
物理设备选择流程: ┌────────────────────────────────────────────────────────────────┐ │ instance │ │ │ │ │ ▼ │ │ vkEnumeratePhysicalDevices() │ │ │ │ │ ▼ │ │ 物理设备1 物理设备2 物理设备3 (遍历) │ │ │ │ │ │ │ └──────────┼──────────┘ │ │ ▼ │ │ isDeviceSuitable() 检查: │ │ ├── 有图形队列? ✓ │ │ ├── 有呈现队列? ✓ │ │ ├── 支持交换链扩展? ✓ │ │ └── 表面格式+呈现模式? ✓ │ │ │ │ │ ▼ │ │ physicalDevice = 选中的设备 │ │ │ │ │ ▼ │ │ vkCreateDevice() │ │ │ │ │ ▼ │ │ device (逻辑设备) │ │ │ │ │ ┌──────┴──────┐ │ │ ▼ ▼ │ │ graphicsQueue presentQueue │ │ (用于绘制) (用于呈现) │ └────────────────────────────────────────────────────────────────┘