自動紋理管理 (Direct3D 9)
紋理管理是決定在指定時間轉譯所需的紋理,並確保這些紋理已載入視訊記憶體的程式。 如同任何演算法,紋理管理配置的複雜性不同,但紋理管理的任何方法都牽涉到下列主要工作。
- 追蹤可用的紋理記憶體數量。
- 計算轉譯所需的紋理,以及哪些不是。
- 判斷哪些現有的紋理資源可以重載另一個紋理影像,以及哪些表面應該終結,並以新的紋理資源取代。
Direct3D 會實作系統支援的紋理管理,以確保已載入紋理以獲得最佳效能。 Direct3D 所管理的紋理資源稱為受控紋理。
紋理管理員會使用時間戳來追蹤紋理,以識別上次使用紋理的時間。 然後,它會使用最近使用最少的演算法來判斷應該移除的紋理。 當兩個紋理的目標是要從記憶體中移除時,紋理優先順序會當做斷線器使用。 如果兩個紋理的優先順序值相同,則會移除最近使用最少的紋理。 不過,如果兩個紋理具有相同的時間戳記,則會先移除優先順序較低的紋理。
當您建立紋理表面時,您會要求紋理表面的自動紋理管理。 若要在 C++ 應用程式中擷取 Managed 紋理,請呼叫 IDirect3DDevice9::CreateTexture 並指定 Pool 參數的D3DPOOL_MANAGED來建立紋理資源。 您無法指定您想要建立紋理的位置。 您無法在建立受控紋理時使用D3DPOOL_DEFAULT或D3DPOOL_SYSTEMMEM旗標。 建立 Managed 紋理之後,您可以呼叫 IDirect3DDevice9::SetTexture 方法,將它設定為轉譯裝置紋理串聯中的階段。
您可以呼叫紋理表面的 IDirect3DResource9::SetPriority 方法,將優先順序指派給 Managed 紋理。
Direct3D 會視需要自動將紋理下載到視訊記憶體中。 根據非本機或非本機視訊記憶體的可用性,系統可能會快取本機或非本機視訊記憶體中的受管理紋理。 受控紋理的快取位置不會與您的應用程式通訊,也不需要此資訊才能使用自動紋理管理。 如果您的應用程式使用比可以容納視訊記憶體更多的紋理,Direct3D 會從視訊記憶體中移除較舊的紋理,讓新紋理有空間。 如果您再次使用移除的紋理,系統會使用原始的系統記憶體紋理表面,在視訊記憶體快取中重載紋理。 雖然需要重載紋理,但也會降低應用程式的效能。
您可以藉由更新或鎖定紋理資源,動態修改紋理的原始系統記憶體複本。 當系統偵測到已變更表面時 - 更新完成之後,或當表面解除鎖定時, 紋理管理員會自動更新紋理的視訊記憶體複本。 產生的效能點擊類似于重載已移除的紋理。
在遊戲中輸入新層級時,您的應用程式可能需要呼叫 IDirect3DDevice9::EvictManagedResources) ,從視訊記憶體 (清除所有受控紋理。
如需資源管理的詳細資訊,請參閱 管理資源 (Direct3D 9) 。
相關主題