共用方式為


根簽章限制

根簽章是黃金房地產,有嚴格的限制和成本需要考慮。

記憶體限制和成本

根簽章的大小上限為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中指定根簽章)。

根簽章