根签名限制
根签名是黄金房地产,有严格的限制和成本需要考虑。
内存限制和成本
根签名的最大大小为 64 个 DWORD。
选择此最大大小以防止滥用根签名作为存储大容量数据的方式。 根签名中的每个条目都有此 64 DWORD 限制的成本:
- 描述符表各花费 1 DWORD。
- 根常量各花费 1 个 DWORD,因为它们是 32 位值。
- 根描述符(64 位 GPU 虚拟地址)各花费 2 个 DWORD。
静态采样器在根签名的大小中没有任何成本。
性能成本
对于根常量(在间接级别方面),性能成本为零,根描述符为 1,描述符表为 2。 如果根签名很大,并且溢出到内存速度略慢(在某些硬件上可能发生),则为根签名末尾溢出项的性能成本添加 1。
在可能具有的硬件上可能发生溢出,例如,根参数空间的固定大小为 16 个 DWORD。 如果使用输入汇编程序,此限制可能会进一步减少一个。 在这种情况下,如果根签名对于 15 或 16 DWORD 本机内存太大,则内存会略慢。 在其他硬件中,没有固定的本机根参数内存(因此不会发生溢出情况)。
对于所有硬件,如果有任何根参数发生更改,驱动程序必须维护所有根参数的版本(与其他存储(如描述符堆和缓冲区资源不同,这些资源不受驱动程序版本控制)。 在发生溢出情况的硬件中,只需对本机区域或溢出区域进行版本控制,具体取决于发生更改的位置。 版本控制的数量应明显保持在必要的最低水平。
通常,请考虑以下准则:
- 根据需要使用一个小根签名,尽管这与更大的根签名的灵活性保持平衡。
- 在大型根签名中排列参数,以便参数最有可能经常更改,或者如果给定参数的访问延迟较低,请先发生。
- 如果方便,请通过将常量缓冲区视图放在描述符堆中来使用根常量或根常量缓冲区视图。
静态采样器
静态采样器(状态完全定义且不可变)是根签名的一部分,但不计入 64 DWORD 限制。 如果采样器可以定义为静态,则无需采样器成为描述符堆的一部分。
使用静态采样器没有性能成本,根签名可以包含静态采样器(存储在根签名中或某些硬件上的保留空间)和动态采样器(存储在采样器描述符堆中)。 可以动态分配和索引描述符堆中的采样器,静态采样器无法对其进行索引。
静态采样器可以编写为 HLSL 着色器中的根签名的一部分(请参阅 在 HLSL中指定根签名)。
相关主题