我正在把我的游戏移到Vulkan。在我的游戏中,我有多个工作线程来生成调用。每个工作线程都有自己的命令缓冲区。因为渲染过程的开始/结束对需要在命令缓冲区开始/结束对内,所以我认为渲染过程需要是线程本地的。对吗?
如果是这样的话,我的第二个问题是如何在工作线程之间共享管道对象?
我目前维护了一个全局管道对象映射,对于每个绘图调用,工作线程都会根据渲染状态、着色器和其他相关信息生成一个键。但是因为渲染过程也需要创建管道对象,所以如果渲染过程是线程本地的,那么就会使管道对象成为本地线程。在这种情况下,如何在不同的工作线程之间共享管道对象?
我肯定弄错了,但我搞不清楚是什么。请帮帮忙。
发布于 2018-07-25 07:07:50
将事情设为线程本地化是实现这一目标的一种方法,但只要您正确地进行自己的(即外部)同步,您就可以从任何线程使用Vulkan对象。
任何作为Vulkan命令参数的对象都将被读取。任何标记为“外部同步”的对象都将被写入。Rest只是同步写-读\写风险,这在多线程编程中是很常见的。
许多Vulkan对象是常量的,我认为VkRenderPass就是其中之一,这将简化事情。即,只有标记为“外部同步”的位置VkRenderPass (即写危险)是它的析构函数。
如果是这样的话,我的第二个问题是如何在工作线程之间共享管道对象?
同样的规则也适用于VkPipeline对象。与vkCmd*命令不同,创建命令(vkCreateGraphicsPipelines)不会保留VkRenderPass对象:
作为参数传递以创建另一个对象的
VkRenderPass对象,在传入的命令持续时间后,该对象不会进一步访问该对象。
而且在任何情况下,他们只读它(没有“外部同步”)。和读-读“危险”不需要同步。因此,在将VkRenderPass迁移到其他线程时,您无需担心VkPipeline es。
https://stackoverflow.com/questions/51507986
复制相似问题