VkInstance 和 VkDevice 是 Vulkan 中两个非常重要但不同层次的概念:
VkInstance
- 是 Vulkan 程序的全局上下文,代表着与 Vulkan 系统的连接
- 主要职责:
- 初始化 Vulkan 库
- 加载全局扩展
- 设置调试回调
- 枚举物理设备 (GPU)
- 每个程序通常只需要一个 VkInstance
示例代码:
VkInstanceCreateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
createInfo.pApplicationInfo = &appInfo;
// 设置需要的扩展和验证层
VkInstance instance;
vkCreateInstance(&createInfo, nullptr, &instance);VkDevice
- 是对物理设备 (GPU) 的逻辑抽象,代表着与具体 GPU 的连接
- 主要职责:
- 创建各种 Vulkan 资源 (缓冲区、图像、命令缓冲区等)
- 执行渲染命令
- 管理设备队列
- 处理设备级别的扩展
- 一个程序可以有多个 VkDevice,每个对应一个物理设备
示例代码:
VkDeviceCreateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
createInfo.pQueueCreateInfos = &queueCreateInfo;
createInfo.queueCreateInfoCount = 1;
// 设置需要的设备特性和扩展
VkDevice device;
vkCreateDevice(physicalDevice, &createInfo, nullptr, &device);两者的关系
- VkInstance 是程序级别的,而 VkDevice 是设备级别的
- 必须先创建 VkInstance 才能创建 VkDevice
- VkInstance 用于枚举物理设备,然后基于物理设备创建 VkDevice
- 销毁时顺序相反:先销毁所有 VkDevice,最后销毁 VkInstance