Java Vulkan-使用多线程时采样器使用的图像错误

Java Vulkan-使用多线程时采样器使用的图像错误,java,multithreading,vulkan,Java,Multithreading,Vulkan,我目前正在使用Vulkan开发图形引擎,在尝试并行渲染场景时,我遇到了纹理采样器的严重问题。问题是,当我使用单线程执行此操作时,每个纹理都被渲染得很好,但在多线程下,纹理似乎偶尔会切换,从而产生图形瑕疵(下面的示例)。我尝试了很多事情,比如非常严格的同步,每个纹理都有新的采样器,每个工作者都有新的描述符集,但这些都没有改变任何事情,我几乎不知道该做什么了。也许有人对这里的罪魁祸首有点模糊的想法 下面是一个在单线程中一切正常的示例: 这里有一个例子,其中很少有纹理是不同的,比如空白或奇怪的树

我目前正在使用Vulkan开发图形引擎,在尝试并行渲染场景时,我遇到了纹理采样器的严重问题。问题是,当我使用单线程执行此操作时,每个纹理都被渲染得很好,但在多线程下,纹理似乎偶尔会切换,从而产生图形瑕疵(下面的示例)。我尝试了很多事情,比如非常严格的同步,每个纹理都有新的采样器,每个工作者都有新的描述符集,但这些都没有改变任何事情,我几乎不知道该做什么了。也许有人对这里的罪魁祸首有点模糊的想法

下面是一个在单线程中一切正常的示例:

这里有一个例子,其中很少有纹理是不同的,比如空白或奇怪的树

如果您想在这里的存储库(分支:FirstOracle-0.5.5)中查看代码:

渲染主要在此类中执行:

要运行,Java 12必须具有以下运行配置: 模块:甲骨文引擎 主类:com.firststory.firstoracle.templates.optimization.App3D VM参数: -Doptimised=false --启用预览 -DRenderingFrameworkClassName=com.firststory.firstoracle.vulkan.VulkanFrameworkProvider
-threads=[要渲染的线程数,单线程1个,多线程2个]

在您的例子中,“限制性同步”是什么意思?即使有多个线程,这些故障是否也会发生,但实际上它们是一个接一个地执行的?描述符池是否跨线程共享?如何将命令缓冲区提交到队列?验证层是否报告了任何错误?是的,这就是我的意思,我试着让线程一次只运行一个线程,并得到相同的结果。我还尝试在使用相同的线程中创建描述符池,但也没有看到任何改进。主命令缓冲区内置于工作线程中,并返回到主线程,在主线程中,它们都在一次调用中提交。它们还与信号量同步,以便按顺序执行主缓冲区。验证层不会报告任何错误。所以可能是驱动程序错误?您是否尝试在其他硬件上运行应用程序?哦,我发现我犯了一个错误——我的意思是“命令池”而不是“描述符池”。命令池是否跨线程共享?或者每个线程都有单独的命令池?(我希望每个线程都有一个单独的池,但需要明确的是,通常每个线程都需要一个单独的命令池;这不仅仅是一个花哨的建议,除非您想自己执行录制命令缓冲区的完全同步)。我在另一台PC上检查了它,结果完全一样。关于命令池::每个线程都有自己的线程(多线程使用情况由验证层报告)。我会尽力的