我尝试在各个网站上查找这个问题的答案,包括关于DirectX 11计算着色器类型的MS Docs文档;但是我没有找到任何提及这些缓冲区类型性能差异的内容。
它们在性能方面完全相同吗?
如果不是,那么在各种情况下使用每种缓冲区的最佳方式是什么?
我尝试在各个网站上查找这个问题的答案,包括关于DirectX 11计算着色器类型的MS Docs文档;但是我没有找到任何提及这些缓冲区类型性能差异的内容。
它们在性能方面完全相同吗?
如果不是,那么在各种情况下使用每种缓冲区的最佳方式是什么?
GPU/Driver组合会导致性能有所不同。
这里有一个项目,可以进行基准测试,其中线性/随机案例最有用。
如果要比较cbuffer访问与其他缓冲区访问的性能(在NVidia上,在进入昂贵的着色器之前常常需要执行缓冲区到cbuffer gpu复制),则常量访问也很有用。
https://github.com/sebbbi/perftest
请注意,不同的缓冲区(在d3d11领域)具有不同的限制,性能收益可能受到这些限制的影响。
除了接受的答案之外,
结构化缓冲区中的元素如果未对齐到128位步长[大小为float4],还会有性能损失。如果不对齐,则可能导致单个float4跨越缓存行,从而导致高达5%的性能损失。
解决此问题的示例是使用填充来重新对齐元素:
struct Foo
{
float4 Position;
float Radius;
float pad0;
float pad1;
float pad2;
float4 Rotation;
};