選擇資源
資源為 3D 管線所使用之資料的集合。 建立資源並定義其行為,為著手設計應用程式的第一步。 本指南將說明為應用程式選擇所需資源的基本主題。
識別需要資源的管線階段
第一個步驟是選擇將使用資源的圖形管線階段 (或多階段)。 也就是說,識別會從資源讀取資料的每個階段,以及將資料寫出至資源的階段。 瞭解將使用資源的管線階段,會決定將呼叫以將資源繫結至階段的 API。
以下資料表列出可以繫結至每個管線階段的資源類型。 它包含資源是否可以繫結為輸入或輸出。
管線階段 | In/Out | 資源 | 資源類型 |
---|---|---|---|
輸入組合語言 | In | 頂點緩衝區 | 緩衝區 |
輸入組合語言 | In | 索引緩衝區 | 緩衝區 |
著色器階段 | In | 著色器資源檢視 | 緩衝區、Texture1D、Texture2D、Texture3D |
著色器階段 | In | 著色器常數緩衝區 | 緩衝區 |
串流輸出 | 外 | 緩衝區 | 緩衝區 |
輸出合併 | 外 | 轉譯目標檢視 | 緩衝區、Texture1D、Texture2D、Texture3D |
輸出合併 | 外 | 深度/樣板檢視 | Texture1D、Texture2D |
識別每個資源的使用方式
一旦您選擇應用程式將使用的管線階段 (且因此每個階段都需要的資源),下一個步驟是決定每個資源的使用方式,也就是 CPU 或 GPU 是否可以存取資源。
應用程式執行的硬體至少會有一個 CPU 和一個 GPU。 若要挑選使用量值,請考慮需要從下列選項讀取或寫入資源的處理器類型。
資源使用狀況 | 可以透過以下方式更新 | 更新頻率 |
---|---|---|
預設 | GPU | 很少 |
動態 | CPU | 常用 |
預備 | GPU | n/a |
固定 | CPU (僅在資源建立時間) | n/a |
預設使用量應該用於預期由 CPU 不常更新的資源 (每個畫面少於一次)。 在理想情況下,CPU 永遠不會直接寫入預設使用量的資源,以避免潛在的效能損失。
動態使用量應該用於 CPU 相對頻繁更新的資源 (每個畫面一次或多次)。 動態資源的一般案例是建立動態頂點和索引緩衝區,以在執行階段填入每個畫面的使用者檢視點可看見的幾何相關資料。 這些緩衝區只會用來轉譯該畫面的使用者可見的幾何。
暫存使用量應該用來將資料複製到其他資源,以及從其他資源複製資料。 典型的案例是將具有預設使用量 (CPU 無法存取) 的資源中的資料,複製到具有暫存使用量 (CPU 可以存取) 的資源中。
當資源中的資料永遠不會變更時,應該使用不可變的資源。
另一種查看相同想法的方式是思考應用程式對資源有何用途。
應用程式如何使用資源 | 資源使用狀況 |
---|---|
載入一次且永遠不會更新 | 不可變或預設 |
應用程式會重複填滿資源 | 動態 |
轉譯到紋理 | 預設 |
GPU 資料的 CPU 存取 | 預備 |
如果您不確定要選擇的使用量,請從預設使用量開始,因為它預期會是最常見的情況。 著色器常數緩衝區是一個應該一律具有預設使用量的資源類型。
將資源繫結至管線階段
只要符合資源建立時所指定的限制,資源就可以同時繫結至一個以上的管線階段。 這些限制會指定為使用旗標、繫結旗標或 CPU 存取旗標。 更具體來說,只要無法同時讀取和寫入資源的一部分,資源就可以同時繫結為輸入和輸出。
繫結資源時,請考慮 GPU 和 CPU 將如何存取資源。 專為單一用途而設計的資源 (請勿使用多個使用量、繫結和 CPU 存取旗標),可能會產生較佳的效能。
例如,請考慮多次做為紋理使用的轉譯目標案例。 有兩個資源可能更快:轉譯目標和做為著色器資源的紋理。 每個資源只會使用一個繫結旗標,指出「轉譯目標」或「著色器資源」。 資料會從轉譯目標紋理複製到著色器紋理。
本範例中的這項技術可能會藉由隔離著色器紋理讀取的轉譯目標寫入來改善效能。 確定的唯一方法是實作這兩種方法,並測量特定應用程式中的效能差異。
相關主題