Directx 12 DX12-描述符堆优化方法

Directx 12 DX12-描述符堆优化方法,directx-12,Directx 12,我一直在构建DX12渲染器。目前,在查看了许多示例(Mini-Engine、BGFX等)之后,我认为我终于找到了描述符绑定的最佳解决方案。 过程如下: 调用addTexture或任何add资源时-从静态着色器可见堆(CPU和GPU句柄)分配描述符句柄 当用户想要绑定描述符集时,检查集合中的所有描述符,并使用创建描述符时分配的GPU句柄调用SetRootDescriptorTable 这是最理想的方法吗?它只需要在帧的开头绑定2个堆(sampler和cbv_srv_uav)并调用setRoot

我一直在构建DX12渲染器。目前,在查看了许多示例(Mini-Engine、BGFX等)之后,我认为我终于找到了描述符绑定的最佳解决方案。 过程如下:

  • 调用addTexture或任何add资源时-从静态着色器可见堆(CPU和GPU句柄)分配描述符句柄
  • 当用户想要绑定描述符集时,检查集合中的所有描述符,并使用创建描述符时分配的GPU句柄调用SetRootDescriptorTable

这是最理想的方法吗?它只需要在帧的开头绑定2个堆(sampler和cbv_srv_uav)并调用setRootDescriptable。(我们实际上不使用rootDescriptor,因为我们的目标平台是控制台(AMD gpu),其根签名限制为13个DWORD)

对于DirectX 12,实际上没有“一种最佳方法”。主要限制是一次只能有一个
D3D12\u描述符\u堆类型\u CBV\u SRV\u UAV
和一个
D3D12\u描述符\u堆类型\u采样器
堆处于活动状态。更改活动堆(或rootsigs或pso)并不特别昂贵,因此它实际上取决于您如何管理整个场景图。通过
OMSetRenderTargets
,一次最多有一个
D3D12\u描述符\u堆类型\u RTV
和一个
D3D12\u描述符\u堆类型\u DSV
处于活动状态。我听到很多人在谈论根据更新频率对描述符表进行分类。这是否意味着,如果我有一个VP矩阵,我每帧只调用一次SetGraphicsRootDescriptable(VP矩阵cbv),然后每个对象调用SetGraphicsRootDescriptable(模型矩阵cbv)?建议是DX11性能建议的DX12版本,关于按频率组织常数缓冲区的更新。这使您可以长时间重复使用CB,而不必为每次绘图生成新的大CB内存范围。一般来说,如果您可以在不必更新的情况下就地重用某些内容,您将获得更好的性能。@ChuckWalbourn听说更改活动堆并不十分昂贵,这很有趣,因为我记得这篇文章曾指出,这可能会导致gpu刷新,并且可以避免。这真的不再有效了吗?这对英特尔硬件来说可能比其他供应商更重要。DX 12肯定存在硬件设计方面的特定问题,而解决供应商设计中的微观差异主要取决于开发人员(与DX11一样,运行时试图隐藏这些差异)。