我正在研究DirectX 12,并且想知道切换管道状态对象的性能如何。我从正在阅读的源中收到冲突的报告,即有些人说它很慢,而另一些人说这是相当快的。

所使用的“慢速”参数是:每当您使用SetPipelineState()时,GPU都必须在后台进行大量工作,例如重新编译等。

使用的“快速”参数是:管道状态的所有计算都是在创建管道状态对象时完成的,因此GPU可以仅交换一些指针就可以了。

哪个是对的? SetPipelineState()的性能如何?使用时应注意什么?

最佳答案

为了快速回答,您可能永远不会在切换PSO时遇到性能问题,这就是它们最初设计时的方式。

对于更长的答案,更改管道状态对象的成本将主要取决于以下三个条件:

  • 硬件和驱动程序效率。
  • 将要打开或关闭的管线阶段,例如镶嵌单元。
  • 根签名,因为它很接近但仍然是一个抽象,所以驱动程序可能需要做一些工作来准备它的映射。

  • PSO被设计为尽可能快地切换,这是自给自足的,并且至少在nVidia和AMD上,唯一的着色器编译发生在创建时,而不是使用时。在AMD上,甚至可以从ID3D12PipelineState::GetCachedBlob的结果中提取一些实际的微代码程序集。一个观察结果是,他们不再像DX11那样使用提取着色器系统来处理不同的输入布局,因为它现在已成为PSO描述的一部分。

    必须提到的是,DX12的一大优势还在于它提供了对无限资源的访问。使用此功能,可以使用巧妙的实例化和ExecuteIndirect将 Material 冲洗量降低大约十倍,您可以让GPU决定 Material 和几何形状而无需太多交互。

    因为信息以某种方式是公开的(http://www.wihlidal.ca/Presentations/GDC_2016_Compute.pdf)。



    Xbox One上的PSO更改实际上在CPU上是免费的,因为它们能够直接从GPU使用它们。令人遗憾的是,它在PC上不可用,但是它可以帮助您降低对PSO开关的担心。

    09-07 22:20