我对使用主命令缓冲区和辅助命令缓冲区感到困惑。
从这个NVIDIA示例中,我了解'重用cmd'是主命令缓冲区,'重用obj-level cmd'是辅助命令缓冲区(相对于对象)。是这样吗?
此性能表明'重用cmd'比'重用obj-level cmd'更好(更快)。因此我得出结论,仅使用Primary比使用Secondary缓冲区更好,但是,所有样本似乎都在多线程渲染中使用辅助缓冲区。
使用多线程渲染时,我必须使用辅助命令缓冲区吗?
如果我应该支持多个队列,我是否必须使用所有多个队列? (多线程 - >生成命令缓冲区 - >提交多个队列) 或使用单一队列很好吗?
答案 0 :(得分:2)
使用多线程渲染时,我必须使用辅助命令缓冲区吗?
没有。从严谨地说,我不明白你为什么要这么做。当然,辅助课程可以让您在更复杂的课程中更轻松。在某些高级渲染引擎中,您可能只使用大型主要问题而遇到一些架构问题。
第一种方法更快,因为它是最简单/最简单的方法。你需要为每个场景构建一次大型主要(驱动程序必须喜欢它,在一个地方拥有所有信息,在需要之前),然后只提交(如每帧0 CPU负载)。但是试试,例如使用这种方法绘制(一般)动态场景 - 你将很难。
如果我应该支持多个队列,我是否必须使用所有多个队列? (多线程 - >生成命令缓冲区 - >提交多个队列)或使用单个队列可以吗?
Q: Should I try to use as many queues as possible?
TL; DR - 如果你不得不问,一个队列可能没什么问题。如果您有一些高度独立的工作(即不需要过多的同步),请使用多个队列。 (它写入不同的图像是一个独立的好迹象)
当然,旧的智慧适用:不要对绩效做出假设。你必须衡量。
答案 1 :(得分:2)
首先,您不应该将任何来自的文档作为使用Vulkan的唯一选项。有许多方法可以使用Vulkan,而这些只是NVIDIA正在研究的一些内容。
所以我得出结论,仅使用Primary比使用Secondary缓冲区更好,但是,所有样本似乎都在多线程渲染中使用辅助缓冲区。
例证:这些样本与NVIDIA正在做的事情不同。
两种NVIDIA方法是:
生成一个完全静态且不变的命令缓冲区。它可能包含了所有可以呈现的东西。据推测,您可以使用内存(间接渲染,UBO数据等)来控制它们出现的位置,如何绘制多个,或者根本不用它们来绘制。
为每个对象生成一个完全静态且不变的命令缓冲区。据推测,您使用内存来控制它们出现的位置。然后,将这些对象渲染到主命令缓冲区中。
这些都没有线程化。
当人们谈论线程渲染时,他们所谈论的是在渲染循环中创建命令缓冲区 。 #2在渲染循环期间不创建辅助命令缓冲区;他们对每个对象都是静态的。
典型的线程渲染系统会创建包含多个对象的辅助命令缓冲区,这些对象将在该帧中稍后提交给主命令缓冲区。每个线程将一些对象计数处理到它们的命令缓冲区。这就是那些线程样本正在做的事情。
所以你在这里将苹果与橘子进行比较。
如果我应该支持多个队列,我是否必须使用所有多个队列? (多线程 - >生成命令缓冲区 - >提交多个队列)或使用单个队列可以吗?
使用您认为需要的任何东西。并行队列操作往往用于内存传输或复杂的计算操作,这些操作将用于下一帧。渲染往往是您需要以特定顺序发生的事情。并且单独的渲染操作的队列间依赖性可能非常难以管理。
另外,请记住Vulkan在许多硬件上运行。特别是,它只需要硬件提供单个队列。因此,即使您进行多队列编程,仍然需要一个支持单队列系统的路径。