DirectX 12 - 描述符堆

时间:2016-05-17 13:17:59

标签: c++ directx directx-12

我刚刚开始学习新的DirectX 12 API。我想在dx12之上编写一种渲染引擎,在初始化期间我应该创建描述符堆。问题在于,此时我不知道将来会创建多少资源视图。例如如果我想要包含某些需要渲染到纹理方法的后期处理效果,我必须为我渲染的纹理创建渲染目标视图。这些RTV的数量可能会有所不同。那么如何创建足够大的描述符堆来应对各种情况呢?

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

使用描述符堆的想法是有一个可见的大gpu和一堆可见的cpu。这是因为csv.reader是一项代价高昂的操作,您不希望每帧调用一次或两次以上。

你需要使用大的gpu可见堆作为环形缓冲区,为你想要准备的当前绘制或调度分配空间,并从你拥有的各种cpu可见描述符中复制。您可以拥有所需的cpu可见描述符堆,它或多或少只是对d3d对象的常规分配包装。

该副本没有任何生命周期保护,并且由CPU立即执行,请注意不要滚动可能仍在GPU上使用的描述符。

我在这里谈论SRV和采样器。 RTV只有CPU可见,您可以自由地创建任意数量的描述符堆,如果您愿意,每个描述符一个,并且不关心d3d对象开销,它将对运行时没有性能影响。

答案 1 :(得分:0)

要记住的一件事是描述符内存几乎是无限的,我知道的大多数项目都有描述符堆,其大小最多为1024个描述符。更不用说directx 11将为每个单独的着色器分配多达128个描述符。所以不要担心只是预先分配一堆描述符。但是,如果您真的想要预算内存的每个方面,我建议您以一种可以知道将在场景中呈现的每个网格和着色器的各个参数的方式构建引擎。