共用方式為


串流資源的必要性

串流資源的必要性,在於避免浪費 GPU 記憶體來儲存不會遭到存取的表面區域,並告知硬體如何篩選相鄰並排。

串流資源或疏鬆紋理

串流資源 (在 Direct3D 11 中稱為並排資源) 為使用少量實體記憶體的大型邏輯資源。

串流資源的另一個別名為疏鬆紋理。 「疏鬆」一詞不僅表示資源的並排特性,也傳達將其並排的主要原因:並非所有資源都會如預期般同時對應。 事實上,應用程式可撰寫串流資源,並讓當中的資料不會刻意針對資源的所有地區和 Mip 進行撰寫。 因此,內容本身可能會顯得疏鬆,而圖形處理單元 (GPU) 記憶體在指定時間的內容對應則會成為其子集 (更加疏鬆)。

在沒有並排的情況下,記憶體配置會透過子資源細微度管理

在不支援串流資源的圖形系統 (也就是作業系統、顯示器驅動程式和圖形硬體) 中,圖形系統會透過子資源細微度來管理所有 Direct3D 記憶體配置。

針對緩衝區,整個緩衝區都會是子資源。

針對紋理 (例如 Texture2D),每個 Mip 層級皆為子資源;針對紋理陣列 (例如 Texture2DArray),指定陣列配量的每個 Mip 層級皆為子資源。 圖形系統僅會公開透過此一細微度管理配置對應的能力。 在串流資源領域中,「對應」一詞代表向 GPU 顯示資料。

如果不進行並排,便無法僅存取 Mipmap 鏈結中的一小部分

假設應用程式掌握到特定轉譯作業只需要存取影像 Mipmap 的一小部分 (甚至可能不必存取指定 Mipmap 的完整區域)。 在理想的情況下,應用程式可向圖形系統傳達此一需求。 隨後,圖形系統只會負責確保所需的記憶體已對應到 GPU 上,而不會產生過多的記憶體分頁。

在實際情況中,如果沒有串流資源支援,圖形系統就只能透過子資源細微度 (例如可供存取的完整 Mipmap 層級範圍) 來得知需要在 GPU 上對應的記憶體。 此外,圖形系統中也不會有任何需求錯誤,如此一來,就有可能需要先使用大量的超額 GPU 記憶體來對應完整的子資源,再轉譯參考已執行記憶體之任何部分的命令。 而這僅是在沒有串流資源支援的情況下,難以在 Direct3D 中使用大量記憶體配置的其中一個問題源頭。

使用軟體分頁將表面化分為較小的並排

軟體分頁可用來將表面劃分為多個夠小的並排,好讓硬體能加以處理。

Direct3D 支援指定端最多可含 16384 個像素的 Texture2D 表面。 16384 寬乘以 16384 高且每個像素 4 個位元組的影像,將耗用 1GB 的視訊記憶體 (加入 Mipmap 後,耗用的記憶體則會加倍)。 在實務上而言,單一轉譯作業很少需要參考完整的 1GB。

有些遊戲開發人員會將地形表面模型化為 128K 乘以 128K。 這樣一來,他們就能在現有 GPU 上執行這項作業,進而將表面劃分為多個夠小的並排,好讓硬體能加以處理。 應用程式必須掌握哪個並排可能為所需的並排,並將其載入至 GPU (軟體分頁系統) 上的紋理快取。

這個方法的顯著缺點之一,在於硬體無從得知正在進行的分頁:當影像中的某個部分需要顯示在跨越多個並排的畫面上時,硬體將無從得知如何跨越多個並排執行固定函式 (也就是有效率的) 篩選。 這表示,管理自身軟體並排的應用程式必須在著色器程式碼中手動進行紋理篩選 (如果需要品質良好的非等向性篩選,就需付出很高的代價) 和/或耗費記憶體在包含鄰近並排資料的並排周圍撰寫裝訂邊,好讓固定函式硬體篩選能持續提供部分協助。

讓表面配置的並排表現法成為頂級功能

如果表面配置的並排表示法為圖形系統中的頂級功能,則應用程式就能告知硬體應提供哪些並排。 這樣一來,就能耗費更少的 GPU 記憶體來儲存應用程式已知不會存取的表面區域,而硬體也能掌握如何跨越相鄰並排進行篩選,藉此減輕開發人員手動執行軟體並排的負擔。

不過,若要提供完整的解決方案,就必須透過某些方式來因應以下情況:無論表面中的並排是否受到支援,目前的最大表面維度為 16384,與應用程式現行所需的 128K+ 有著天壤之別。 其中一個解決方式,就是單純要求硬體支援更大的紋理尺寸,不過,此一選項需耗費大量的成本和/或做出極大的取捨。

在搭配其他需求支援 16K 紋理精確度方面 (例如支援在轉譯期間落於表面的檢視區延伸模組,或支援在篩選期間於表面邊緣換行的紋理),Direct3D 的紋理篩選路徑和轉譯路徑早已飽和。 其中一個可能的因應之道就是定義相關取捨,例如隨著紋理大小超過 16K,就會在某些程度上放棄功能/精確度。 但即便做出此一讓步,在硬體系統因應大型紋理大小的能力方面,仍需投入額外的硬體成本。

大型紋理衍生的問題:表面位置的精確度

隨著紋理變得相當大,就需面對其中一個接踵而來的問題:單一精確度浮點紋理座標 (以及用來支援點陣化的相關插補點) 需在精確度範圍以外執行,才能準確地指定表面上的位置。 這將造成紋理篩選發生抖動。 其中一個代價高昂的選項,就是要求使用雙精確度插補點支援,儘管這個替代方案看似合理,卻有點大材小用。

讓不同維度的多個資源共用記憶體

串流資源可因應的另一個情境,就是讓不同維度/格式的多個資源共用相同的記憶體。 有時,應用程式會具備已知不會同時使用的獨特資源集,或是針對極短暫的使用來建立資源、於隨後將其終結,緊接著又建立其他資源。 有助於擺脫「串流資源」的通用形式,就是允許使用者指向相同 (重疊) 記憶體中的多個不同資源。 換句話說,「資源」(定義維度/格式等) 的建立和終結,可從應用程式觀點的資源基礎記憶體管理分離出來。

串流資源