管理資源 (Direct3D 9)
資源管理是將資源從系統記憶體轉移到裝置可存取的存儲,並從裝置可存取的存儲中移除的過程。 Direct3D 運行時間根據最近使用最少的優先順序技術,有自己的管理演算法。 當 Direct3D 切換至最近使用的優先順序技術時,偵測到裝置可存取記憶體中可以並存的資源多於單一框架中 - IDirect3DDevice9::BeginScene 和 IDirect3DDevice9::EndScene 呼叫之間。
在建立時使用 D3DPOOL_DEFAULT 旗標,指定資源放置於記憶體集區中,最適合指定資源所要求的使用量集。 這通常是視訊記憶體,包括本機視訊記憶體和加速圖形埠 (AGP) 記憶體。 預設池中的資源在裝置的失效狀態與運行狀態之間的轉換中不會持續存在。 必須在呼叫重設之前先釋放這些資源,然後必須重新建立。
在建立時使用 D3DPOOL_MANAGED 旗標來指定受控資源。 受控資源在裝置的遺失和運作狀態之間的轉換過程中仍會持續存在。 這些資源同時存在於視訊和系統記憶體中。 當轉譯期間需要受控資源時,系統就會將受控資源複製到視訊記憶體中。 您可以透過呼叫 IDirect3DDevice9::Reset來還原裝置,而且這類資源會繼續正常運作,而不會重載數據。 不過,如果裝置必須被銷毀並重新建立,則必須重新建立所有資源。
不建議針對變化頻率高的資源使用資源管理。 例如,用於遍歷場景圖的頂點和索引緩衝區會在每個畫面格中,只渲染用戶可見的幾何體,並在每個畫面格進行更新。 由於受控資源受到系統記憶體的支援,因此必須在系統記憶體中更新常數變更,這可能會導致效能嚴重降低。 針對此特定案例,應該使用 D3DPOOL_DEFAULT 以及 D3DUSAGE_DYNAMIC。
不建議使用資源管理的另一個範例(且運行時間明確不允許)是管理使用 D3DUSAGE_RENDERTARGET建立的紋理。 如果轉譯目標所使用的記憶體是由運行時間所管理,則其內容必須在轉譯期間持續複製到系統記憶體,因而造成較大的效能損失。 基於這個理由,必須在預設集區中建立轉譯目標。 如果需要獲取轉譯目標中所含數據的 CPU 存取,則必須使用 IDirect3DDevice9::UpdateTexture或 IDirect3DDevice9::UpdateSurface,將數據複製到以 D3DPOOL_SYSTEMMEM 中建立的資源中。
如需裝置遺失狀態的詳細資訊,請參閱 遺失裝置 (Direct3D 9)。
相關主題