2

我正在研究 DirectX 12,我想知道切换管道状态对象的性能如何。我从我正在阅读的来源中得到相互矛盾的报告,即有些人说它非常慢,而另一些人则说它相当快。

使用的“慢”参数是:GPU 必须在引擎盖下做很多事情,比如在你使用SetPipelineState().

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

哪个是真的?性能如何SetPipelineState(),使用时我应该记住什么?

4

2 回答 2

1

真正的问题是:您使用 SetPipelineState() 做什么?没有它,您将无法更改着色器。您可以更改资源绑定配置。否则您无法更改拓扑。理论上,PipelineState 拥有编程 GPU 所需的所有东西,而且你不能在这里交换块,所以你有点卡在你所拥有的东西上。

现在回答:这取决于 GPU 和驱动程序。是的,在后台做了一些事情。但是,体面的图形驱动程序应该优化并缓存已经完成的内容。含义 - 如果您已经使用了给定的 PipelineState,则使用不同的并返回到原始的应该很快。

于 2016-06-30T08:45:01.893 回答
1

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

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

  • 硬件和驱动程序效率。
  • 即将开启或关闭的流水线阶段,例如曲面细分单元。
  • 根签名,因为它很接近但仍然是一个抽象,驱动程序可能需要做一些工作来准备它的映射。

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

不得不提的是,DX12 的一大优势还在于提供了对无绑定资源的访问。使用该功能,可以将材质刷新量减少十倍左右,使用巧妙的实例化和ExecuteIndirect,您可以让 GPU 决定材质和几何形状而无需太多交互。

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

在 Xbox One 上,ExecuteIndirect 有一些令人难以置信的扩展,其中 PSO 可以通过间接参数切换,这意味着我们可以为整个场景发出单个 ExecuteIndirect,而不管状态或
资源如何变化。

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

于 2016-06-30T17:55:10.923 回答