Vulkan 中物理设备(Physical Device)和逻辑设备(Logical Device)的主要区别:

物理设备(VkPhysicalDevice)

  • 代表系统中实际的 GPU 硬件
  • 用于查询 GPU 的具体能力和特性
  • 可以获取设备的属性,如:
    • 支持的 Vulkan 版本
    • 可用的内存类型
    • 支持的队列族
    • 硬件限制参数

示例代码:

// 枚举物理设备
uint32_t deviceCount = 0;
vkEnumeratePhysicalDevices(instance, &deviceCount, nullptr);
std::vector<VkPhysicalDevice> devices(deviceCount);
vkEnumeratePhysicalDevices(instance, &deviceCount, devices.data());
 
// 查询物理设备属性
VkPhysicalDeviceProperties deviceProperties;
vkGetPhysicalDeviceProperties(physicalDevice, &deviceProperties);

逻辑设备(VkDevice)

  • 是物理设备的逻辑实例
  • 用于实际的 Vulkan 操作接口
  • 定义了应用程序需要使用的具体功能
  • 创建时需要指定:
    • 需要使用的队列
    • 需要启用的设备扩展
    • 设备特性等

示例代码:

// 创建逻辑设备
VkDeviceCreateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
createInfo.queueCreateInfoCount = 1;
createInfo.pQueueCreateInfos = &queueCreateInfo;
createInfo.enabledExtensionCount = deviceExtensions.size();
createInfo.ppEnabledExtensionNames = deviceExtensions.data();
 
VkDevice device;
vkCreateDevice(physicalDevice, &createInfo, nullptr, &device);

关键区别

使用顺序

  • 先选择物理设备
  • 基于物理设备创建逻辑设备

功能范围

  • 物理设备:用于查询和选择 GPU
  • 逻辑设备:用于实际的渲染和计算操作

生命周期

  • 物理设备:由 Vulkan 实例管理
  • 逻辑设备:需要手动创建和销毁

这种设计允许在同一个物理设备上创建多个逻辑设备,每个逻辑设备可以使用不同的功能集合,提供了更好的灵活性和隔离性。