首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在多线程渲染中,Vulkan渲染过程是线程本地的吗?

在多线程渲染中,Vulkan渲染过程是线程本地的吗?
EN

Stack Overflow用户
提问于 2018-07-25 05:46:51
回答 1查看 275关注 0票数 2

我正在把我的游戏移到Vulkan。在我的游戏中,我有多个工作线程来生成调用。每个工作线程都有自己的命令缓冲区。因为渲染过程的开始/结束对需要在命令缓冲区开始/结束对内,所以我认为渲染过程需要是线程本地的。对吗?

如果是这样的话,我的第二个问题是如何在工作线程之间共享管道对象?

我目前维护了一个全局管道对象映射,对于每个绘图调用,工作线程都会根据渲染状态、着色器和其他相关信息生成一个键。但是因为渲染过程也需要创建管道对象,所以如果渲染过程是线程本地的,那么就会使管道对象成为本地线程。在这种情况下,如何在不同的工作线程之间共享管道对象?

我肯定弄错了,但我搞不清楚是什么。请帮帮忙。

EN

回答 1

Stack Overflow用户

发布于 2018-07-25 07:07:50

将事情设为线程本地化是实现这一目标的一种方法,但只要您正确地进行自己的(即外部)同步,您就可以从任何线程使用Vulkan对象。

任何作为Vulkan命令参数的对象都将被读取。任何标记为“外部同步”的对象都将被写入。Rest只是同步写-读\写风险,这在多线程编程中是很常见的。

许多Vulkan对象是常量的,我认为VkRenderPass就是其中之一,这将简化事情。即,只有标记为“外部同步”的位置VkRenderPass (即写危险)是它的析构函数。

如果是这样的话,我的第二个问题是如何在工作线程之间共享管道对象?

同样的规则也适用于VkPipeline对象。与vkCmd*命令不同,创建命令(vkCreateGraphicsPipelines)不会保留VkRenderPass对象:

作为参数传递以创建另一个对象的VkRenderPass对象,在传入的命令持续时间后,该对象不会进一步访问该对象。

而且在任何情况下,他们只读它(没有“外部同步”)。和读-读“危险”不需要同步。因此,在将VkRenderPass迁移到其他线程时,您无需担心VkPipeline es。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51507986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档