0

这似乎是一个问题,一直以来对于一个或另一个 IHV 都有回答,但最近我一直试图就顶点布局和跨所有 IHV 和架构的现代渲染器的最佳实践达成共识。在有人说基准之前,我不能轻易做到这一点,因为我无法访问过去 5 年中每个 IHV 和每个架构的卡。因此,我正在寻找一些可以在所有平台上正常运行的最佳实践。

首先,显而易见的:

  • 将位置与其他属性分开有利于:
    • 阴影和深度预通
    • 每个三角形剔除
    • 基于平铺的延迟渲染器(例如 Apple M1)
  • Interleaved 在 CPU 上比较合乎逻辑,可以有一个Vertex类。
  • 由于能够利用 SIMD,非交错可以使一些 CPU 计算更快。

现在到不太明显的地方。

许多人引用 NVIDIA 的话说,你应该总是交错,而且你应该对齐到 32 或 64 字节。我还没有找到它的来源,而是找到了一份关于NVIDIA顶点着色器性能的文档,但它已经很老了(2013 年),而且是关于 Tegra GPU 的,它是移动的,而不是桌面的。特别是它说:

将顶点数据存储为交错的属性流(“结构数组”布局),这样属性的“过度获取”往往会预取可能对后续属性和顶点有用的数据。将属性存储为不同的、非交错的(“数组结构”)流可能会导致内存系统中的“页面抖动”,从而导致性能大幅下降。

快进 3 年到GDC 2016,EA 提供了一个演示文稿,其中提到了为什么应该去交错顶点缓冲区的几个原因。但是,此建议似乎与 AMD 架构有关,尤其是 GCN。虽然他们提出了一个跨平台的案例来分离位置,但他们建议对所有内容进行去交错,并声明它将允许 GPU:

尽快驱逐缓存行

并且它是 GCN (AMD) 架构的最佳选择。

这似乎与我在其他地方听到的使用交错以充分利用高速缓存行的说法相冲突。但同样,这与 AMD 无关。

有许多不同的 IHV,英特尔、英伟达、AMD 以及现在的 Apple 和 M1 GPU,而且每个都有许多不同的架构,这让我完全不确定今天应该做什么(没有预算来测试几十个GPU 的数量),以便在所有架构中最好地优化性能,而不会导致

性能大幅下降

在一些架构上。特别是,去交错在 AMD 上仍然是最好的吗?它不再是 NVIDIA 的问题,还是桌面 NVIDIA GPU 从来没有问题?其他 IHV 呢?

注意:我对移动设备不感兴趣,只对过去 5 年左右的所有桌面 GPU 感兴趣。

4

0 回答 0