这似乎是一个 IHV 或另一个 IHV 一直以来都得到解答的问题,但最近我一直试图就顶点布局以及跨所有 IHV 和架构的现代渲染器的最佳实践达成共识。在有人说基准测试之前,我无法轻易做到这一点,因为我无法访问过去 5 年中每个 IHV 和每个架构的卡。因此,我正在寻找一些能够在所有平台上良好运行的最佳实践。
首先,显而易见的是:
Vertex类。现在来说说不太明显的事情。
许多人引用 NVIDIA 的话说,您应该始终交错,而且应该对齐到 32 或 64 字节。我还没有找到它的来源,但找到了 NVIDIA 的有关顶点着色器性能的文档,但它已经很旧了(2013 年),并且是关于移动而非桌面的 Tegra GPU。它特别说:
将顶点数据存储为交错的属性流(“结构数组”布局),这样属性的“过度获取”往往会预取可能对后续属性和顶点有用的数据。将属性存储为不同的、非交错的(“数组结构”)流可能会导致内存系统中的“页面抖动”,从而导致性能大幅下降。
快进 3 年到GDC 2016,EA 进行了一次演示,其中提到了应该对顶点缓冲区进行去交错的几个原因。然而,这个建议似乎与 AMD 架构相关,特别是 GCN。虽然他们提出了一个跨平台的案例来分离位置,但他们建议对所有内容进行去交错,并声明这将允许 GPU :
尽快清除缓存行
而且它对于 GCN (AMD) 架构来说是最佳的。
这似乎与我在其他地方听到的说法相冲突,即使用交错以充分利用缓存行。但同样,这与 AMD 无关。
拥有许多不同的 IHV,Intel、NVIDIA、AMD,现在还有 Apple 的 M1 GPU,而且每一个都有许多不同的架构,这让我完全不确定今天应该做什么(没有预算来测试数十个 GPU)。 GPU),以便最好地优化所有架构的性能,而不会导致
结果导致性能大幅下降
在某些架构上。特别是,去交错在 AMD 上仍然是最好的吗?它在 NVIDIA 上不再是问题,还是在桌面 NVIDIA GPU 上从来都不是问题?其他 IHV 又如何呢? …