根签名限制

根签名是优质资产,需考虑严格的限制和成本。

内存限制和成本

根签名的最大大小为 64 DWORD。

选择该最大大小是为了防止滥用根签名来存储大量数据。 根签名中每一项的开销都接近这个 64 DWORD 限制:

  • 每个描述符表的开销为 1 DWORD。
  • 每个根常量的开销为 1 DWORD,因为它们是 32 位值。
  • 每个根描述符(64 位 GPU 虚拟地址)的开销为 2 DWORD。

静态采样器在根签名大小方面没有任何开销。

性能成本

根常量的性能成本(对于间接级别而言)为 0,根描述符的性能成本为 1,描述符表的性能成本为 2。 如果根签名很大,并且从最快内存溢出到稍微慢一些的内存(在某些硬件上可能会发生这种情况),那么根签名结束时溢出项的性能成本增加 1。

例如,根参数空间的固定大小为 16 DWORD 的硬件可能会发生溢出。 如果使用输入汇编程序,这个限制可能会进一步减少 1。 在这种情况下,如果根签名对于 15 或 16 DWORD 的本机内存来说太大,就会溢出到稍微慢一些的内存。 其他硬件没有固定的本地根参数内存(因此不会发生溢出情况)。

对于所有硬件而言,如果任何根参数发生更改,驱动程序必须保存某一版本的所有根参数(不同于描述符堆和缓冲区资源等其他存储,驱动程序没有对它们进行版本控制)。 发生溢出的硬件中,只需对本机或溢出区域进行版本控制,具体取决于发生更改的位置。 版本控制量应明显保持为必要的最小值。

通常,考虑以下准则:

  • 必要时使用小的根签名,但要与较大根签名的灵活性取得平衡。
  • 在大的根签名中安排参数,以便最可能经常更改的参数首先出现,或者如果给定参数的低访问延迟很重要的话参数首先出现。
  • 如果方便,使用根常量或根常量缓冲区视图,而不是将常量缓冲区视图放在描述符堆中。

静态采样器

静态采样器(状态完全定义且不可更改的采样器)是根签名的一部分,但不计入 64 DWORD 限制。 如果可以将采样器定义为静态,则无需将采样器作为描述符堆的一部分。

使用静态采样器没有性能成本,根签名可以包含静态采样器(存储在根签名中,或存储在某些硬件上的预留空间中)与动态采样器(存储在采样器描述符堆中)的混合。 描述符堆中的采样器可以动态分配和编制索引,而静态采样器不能。

静态采样器可在 HLSL 着色器中作为根签名的一部分编写(请参见在 HLSL 中指定根签名)。

根签名