2014-08-29 153 views
0

我對DirectX 11中的寄存器有些困惑。讓我舉一個例子:假設你有3個模型。它們每個都具有映射到寄存器t0的紋理。模型1和3使用相同的紋理,模型2使用不同的紋理。繪製模型1時,我將紋理資源視圖設置爲註冊0並繪製模型。然後我爲模型2和模型3做同樣的事情,但爲模型3使用相同的資源視圖。當我爲模型2設置紋理時,GPU是否用不同的紋理替換GPU內存中的紋理,或者是否保持紋理內存,直到需要空間並只是移動一些指針?我想盡量減少數據傳輸到GPU,我想知道我是否應該像這樣處理這些情況,或者DX是否爲我處理。順便說一句,我沒有使用Effects 11框架。Directx 11寄存器

在此先感謝。

回答

0

我想你要問的東西在很大程度上取決於硬件和驅動程序的實現。這也是爲什麼DX11文檔不會對內存如何管理圖形資源做任何聲明。我無法真正給你任何有效的來源,但我相信假設你製作視圖的紋理/緩衝區將駐留在GPU的內存(尤其是你更頻繁訪問的內存)中是安全的。圖形驅動程序將進行大量訪問優化。但是,最好儘可能少地改變圖形管道的狀態。

您可以在圖形管線的深入討論讀取here

1

在一般情況下,你應該假設一旦你創造的GPU資源(例如,使用CreateTexture2D),內存是保留的,居民對於資源供3D管線使用。請注意,這是獨立的數據轉移到GPU,這也是通過Map/UnmapUpdateSubresource明確。

在某些情況下,操作系統會將內存交換出來,但通常應儘可能避免這種情況。例如,如果您創建了一堆大紋理,但從不訪問它們,則視頻內存管理器最終會將它們分頁到系統內存以執行其他任務(例如,觀看Netflix /在另一個顯示器上瀏覽互聯網)。如果您過度使用視頻內存(使用的系統數量超過可用容量),您也可能遇到實際問題。這曾經是不可能的(你只會得到E_OUTOFMEMORY),但現在內存管理器試圖通過將事情分頁到系統內存或磁盤來實現它。這是你應該真的努力避免,因爲如果你曾經綁定和使用一個頁面調出資源,你會得到一個小故障等待內存管理器將其重新分頁使用。

請注意,上述確實只適用於獨立GPU配置。在集成系統上來自英特爾或AMD,您將獲得具有完全不同特性的統一內存。但總的來說,你應該首先針對不同的配置,因爲如果你搞砸了,你就不得不擔心更多的性能障礙,而且它們不太可能在集成上出現。

回到你原來的問題,改變繪製調用之間的SRV並不是那麼昂貴 - 它不僅僅是指針交換,而且遠不是通過總線傳輸整個紋理的成本。您應該可以隨意抽取與您的平局相同頻率的SRV,並且不會對性能產生不利影響。