共用方式為


記憶體管理策略

Direct3D 12 的記憶體管理員,對於 UMA 或離散 (非 UMA) 配接器,以及 GPU 適配卡之間相當多的架構差異,所有不同層級的支援可能會非常複雜。

本節所述的 Direct3D 12 記憶體管理建議策略是「分類、預算和數據流」。

資源類型

自 Direct3D 9 以來,「認可資源」的基本概念(同時建立初始化於 Managed 物理記憶體中的虛擬和實體地址空間)一直在左右,不過,Direct3D 12 中的虛擬尋址和實體尋址可以在 Direct3D 12 中取笑,以允許應用程式仔細管理物理記憶體。

除了認可的資源之外,Direct3D 12 的堆積建構還會啟用兩種類型的資源:「放置」和「保留」。 在 Direct3D 11 中,「保留」資源稱為「磚資源」。

保留的資源與保留的資源不同,因為保留的資源有自己的唯一 GPU 虛擬位址空間。 這允許預先配置大量的 VA 空間,然後允許將 VA 頁面對應到堆積的某些區段,而應用程式會即時重新設定排列。 VA 空間是連續的,而且可以疏鬆地對應至 。

保留的資源可以透過 API 呼叫來參考堆積中的區域,例如 UpdateTileMappings,而且可以透過即時更新頁面數據表來讓應用程式常駐。 當 VA 範圍對應至 NULL 或非常駐堆積時,該部分的資源會被視為非常駐。 當 VA 範圍對應至常駐堆積時,該部分的資源會被視為常駐。 堆積會在建立時常駐。

放置的資源是更簡單的設計,只是堆積特定區域的指標(例如,5Mb 堆積中紋理的 1Mb 區域)。 別名屏障可讓您使用重疊放置的資源(請參閱 createPlacedResourceResourceBarrier)。

所有 Direct3D 12 硬體上都無法使用保留的資源,而放置的資源是合理的後援,不過放置的資源必須連續且不能部分常駐。

記憶體預算

在 Direct3D 12 中,當您配置堆積時,您要建立認可資源的實體記憶體層面。 Direct3D 12 提供更明確的記憶體區段選擇(在視訊和系統記憶體之間選擇)。 UMA 配接器只有單一記憶體區段,系統記憶體。

GPU 不支援頁面錯誤,因此開發人員必須意識到它們不會過度認可,尤其是只有 1Gb 系統記憶體的系統說。 如果應用程式透過認可執行,則OS會依對物理記憶體的需求,使用更粗略的處理程式排程。 排程器會凍結前景進程,並基本上將其中一些進程分頁,以便在想要執行的背景進程中分頁。 可用的物理記憶體可能會因使用者在背景中執行的動作而有很大的差異(例如執行瀏覽器或觀看視訊)。

記憶體預算的 API QueryVideoMemoryInfo。 對於離散配接器「本機」是視訊記憶體,「非本機」是系統記憶體。 對於非本機的UMA配接器,一律為零。 其中一個設計問題是您的引擎會同時管理預算,還是只管理本機預算。 只管理本機預算更簡單,但有一些警告:例如,假設本機預算上限為 1Gb,則所有堆積都會來自 UMA 系統中的 1Gb,而且系統記憶體沒有溢位(顯然,因為沒有)。

由於應用程式的 Direct3D11 受控記憶體,未使用的資源基本上會分頁。

選擇最適當的資源維度。 請考慮資源大小是否適合應用程式實際執行的情況。 有些使用者可能會在視窗中執行應用程式,或螢幕解析度為800x600。

分類策略

若要在記憶體系結案例中有效地管理資源,請考慮將資源分類為下列各項:

分類 例子 物件和 API 功能 管理注意事項
危急 遊戲 UI 命令配置器、命令佇列、查詢堆積、資源和資源堆積。 這些項目應該進入不可分頁/一律認可的記憶體。
Scaled/ Optional 層級特定的模型和紋理,交換鏈結,天空框,第一人稱玩家角色模型 資源和堆積。 認可資源,但也放置和保留的資源可能也正常運作。 將記憶體落地預算整合到轉譯演算法中。 選擇適當的可用詳細數據層級,並重新評估每一畫面不到一次。 技術包括使用可變大小的資源和交換鏈結調整。
重複使用的資源 陰影緩衝區、延遲轉譯資源、後續處理資源、光源數據快取 資源和堆積。 重疊會將資源放在堆積和別名屏障上。 重複使用框架內的大型資源或堆積區域,以縮減整個框架的需求。 使用框架內部記憶體重複使用的技術。 在 Direct3D 11 中,應用程式只能重複使用具有相同類型且可能夠大的維度的資源。 Direct3D 12 堆積允許重疊的資源更容易且更重複使用。
串流資源 地形、開放世界紋理和幾何 資源和堆積。 自由線程建立、背景CPU線程和背景複製命令佇列和清單。 部分落地,通常是根據可見性(使用檢視-frustum 或以距離為基礎的評估),並重新評估落地需要每個框架。
當 GPU 配接器支援堆積內的保留資源時,可以使用個別磚部分落地管理和框架間重複使用的技術。
使用框架間記憶體重複使用的技術,可以完成部分子資源落地,但較不理想。 具有堆積的放置資源應該可加快回收速度,但認可的資源可以做為後援使用。

對於大部分的工作,應用程式會吸引到串流資源越多,它們就會利用放置和保留的資源越多,這會將這四個分類之間的記憶體重複使用最大化。 應用程式串流越多,其預算越多,並排定頻寬的優先順序。

通常,Direct3D 12 圖形引擎需要採用更多樣化的動態預算,並比過去更嚴格地執行。 最佳應用程式會將所有四個類別都放在提供給程式的預算中,將遊戲發揮從背景行動應用程式調整為全螢幕離散預算。 但是,許多應用程式可能會從太多重要的類別類型資源開始而苦苦掙扎。 Direct3D 11 可讓資源匿名建立並佔用重要狀態,而不會影響效能。 不過,對於 Direct3D 12,開發人員必須在引擎和中間件中努力搜尋隨機建立的資源,並將它們重新指派給其他類別之一。

其他問題區域包括中間件元件、使用者控件和框架內部串流。 中間件元件可能不會公開至預算,也不需要緊密合作。 中間件元件可能會將功能公開為轉譯技術;和應用程式可能依賴公開中間件和引擎設定。 開發人員可以依賴 Direct3D 11 進行分頁並達到正確的幀速率。 在某些情況下,Direct3D 11 應用程式可能已將資源內容分頁到每一個畫面;且導致使用者可接受的幀速率。 大部分引擎只會將資源數據串流為背景活動,其中沒有正常回復至高優先順序的框架內部串流。 要求引擎實作,以削弱他們尋求的一些 CPU 額外負荷提升,方法是移至 Direct3D 12。 引擎開發人員可以考慮將其框架調成階段,以提供更多可重複使用資源的機會:並可能與中間件廠商合作,以支援放置的資源和堆積,以便重複使用框架內部記憶體。

CreateCommittedResource

CreateReservedResource

Direct3D 12 程式設計手冊

記憶體管理

資源系結