【发布时间】:2021-07-23 04:22:46
【问题描述】:
我正在尝试创建一个可以动态创建附加窗口的应用程序。每个窗口都将使用 Vulkan 绘制,我知道这意味着每个窗口都必须包含它自己的 SwapChain 资源(图像视图、帧缓冲区等)和图形管道(因为它引用了交换链的范围)。我想知道每个窗口是否还必须记住自己当前的队列系列,或者我是否可以假设每个窗口都可以使用相同的队列系列。具体来说,要查找当前队列族,您需要使用以下方法确定特定队列族是否支持表面呈现:
VkResult vkGetPhysicalDeviceSurfaceSupportKHR(
VkPhysicalDevice physicalDevice,
uint32_t queueFamilyIndex,
VkSurfaceKHR surface,
VkBool32* pSupported);
这需要VkSurfaceKHR,因此需要特定窗口的HWND 和HINSTANCE,但我不确定当前队列系列是否可能在由同一操作系统创建的不同窗口之间发生变化,或者如果我可以安全地为每个窗口使用相同的窗口。
类似地,在查看swap chain recreation within the vulkan-tutorial 时,我读到VKSurfaceFormatKHR::format 在窗口调整大小期间很少更改,这就是在窗口调整大小操作期间需要重建渲染通道 的唯一原因。在调整窗口大小期间跳过此步骤中的渲染通道重新创建有多安全?同一渲染通道用于不同窗口的效果如何?
如果每个窗口都使用类似的图形管道,更具体地说,使用相同的同步对象,是否通常让每个窗口附加到相同的命令缓冲区并使用单个 vkQueueSubmit?我只是问,因为您需要为飞行中的每个帧创建一个命令缓冲区,因此所需的命令缓冲区数量将是 numWindows * numFramesInFlight 感觉过多,但我不确定它是否与单个大飞行中每帧的命令缓冲区(由每个窗口附加)。
顺便说一句,使用 Vulkan 绘制到多个窗口的资源似乎相当稀缺,所以如果有人知道任何好的资源,我将不胜感激。
【问题讨论】:
标签: c++ window rendering vulkan