IDXGIDevice4::OfferResources1 方法 (dxgi1_5.h)

允許作業系統釋放資源的視訊記憶體,包括捨棄內容並取消認可記憶體。

語法

HRESULT OfferResources1(
  [in] UINT                         NumResources,
  [in] IDXGIResource                * const *ppResources,
  [in] DXGI_OFFER_RESOURCE_PRIORITY Priority,
  [in] UINT                         Flags
);

參數

[in] NumResources

類型: UINT

ppResources引數陣列中的資源數目。

[in] ppResources

類型: IDXGIResource*

要提供之資源的 IDXGIResource 介面指標陣列。

[in] Priority

類型: DXGI_OFFER_RESOURCE_PRIORITY

DXGI_OFFER_RESOURCE_PRIORITY型別值,指出有價值的資料。

[in] Flags

類型: UINT

指定 DXGI_OFFER_RESOURCE_FLAGS

傳回值

類型: HRESULT

這個方法會傳回 HRESULT 成功或錯誤碼,如果陣列中的資源或優先順序無效,可以包含E_INVALIDARG。

備註

OfferResources1 (原始 IDXGIDevice2::OfferResources API 的延伸模組,) 可讓以 D3D 為基礎的應用程式取消認可配置支援存放區,以降低低記憶體條件下的系統認可。 無法重複使用取消認可的配置,因此加入宣告新的DXGI_OFFER_RESOURCE_FLAG_ALLOW_DECOMMIT旗標表示必須正確處理新的回收結果。 請參閱 下列DXGI_RECLAIM_RESOURCE_RESULTS 和範例中的旗標描述。

OfferResources1ReclaimResources1可能無法OfferResourcesReclaimResources交換使用。

Priority參數所指定的優先順序值描述呼叫端考慮內容的價值。 作業系統會使用優先順序值,依優先順序捨棄資源。 作業系統會捨棄低優先順序提供的資源,再捨棄優先順序較高的資源。

如果您在資源系結至管線時呼叫 OfferResources1 來提供資源,則資源不會系結。 您無法在對應的資源上呼叫 OfferResources1 。 在您提供資源之後,必須先呼叫 ReclaimResources1 方法來回收資源,否則資源無法對應或系結至管線。 您無法呼叫 OfferResources1 來提供不可變的資源。

若要提供共用資源,請只在其中一個共用裝置上呼叫 OfferResources1 。 若要確保資源的獨佔存取權,您必須使用 IDXGIKeyedMutex 物件,然後只在您保存 mutex 時呼叫 OfferResources1 。 事實上,除非您使用 IDXGIKeyedMutex ,否則您無法提供共用資源,因為不支援提供不使用 IDXGIKeyedMutex 的共用資源。

使用者模式顯示驅動程式可能不會立即提供您在 對 OfferResources1呼叫中指定的資源。 驅動程式可以延後提供它們,直到下一次呼叫 IDXGISwapChain::P resentIDXGISwapChain1::P resent1ID3D11DeviceCoNtext::Flush為止。

範例

UWP 型應用程式會暫停到背景,並想要將其圖形資源提供給系統,以防另一個應用程式想要它們。 應用程式會在繼續時回收這些資源。 應用程式也瞭解此平臺上可用的系統認可總數很小,並願意允許從系統認可中移除其資源。 如果回收進程因為系統記憶體不足而失敗,應用程式會處理錯誤狀況。

struct Texture 
{ 
    UINT32 Width; 
    UINT32 Height; 
    UINT32 Mips; 
    ID3D11Texture2D* pResource; 
};  

void Application::OfferInterfaceResources(ID3D11Device* pD3D11Device) 
{ 
    CComPtr<IDXGIDevice4> pDXGIDevice; 
    ThrowIfFailed(pD3D11Device->QueryInterface(&pDXGIDevice)); 

    for(Texture& t : m_Textures) 
    { 
        CComPtr<IDXGIResource> pDXGIResource; 
        ThrowIfFailed(t.pResource->QueryInterface(&pDXGIResource));   
        ThrowIfFailed(pDXGIDevice->OfferResources1(1, &pDXGIResource, DXGI_OFFER_RESOURCE_PRIORITY_NORMAL, 
											DXGI_OFFER_RESOURCE_FLAG_ALLOW_DECOMMIT)); 
    } 
} 

void Application::ReclaimInterfaceResources (ID3D11Device* pD3D11Device) 
{ 
    CComPtr<IDXGIDevice4> pDXGIDevice; 
    ThrowIfFailed(pD3D11Device->QueryInterface(&pDXGIDevice));  

    for(Texture& t : m_Textures) 
    { 
        CComPtr<IDXGIResource> pDXGIResource; 
        ThrowIfFailed(t.pResource->QueryInterface(&pDXGIResource));       

        DXGI_RECLAIM_RESOURCE_RESULTS Result; 
        ThrowIfFailed(pDXGIDevice->ReclaimResources1(1, &pDXGIResource, &Result)); 

        // If the surface lost its backing commitment, it must be recreated. 

        if(Result == DXGI_RECLAIM_RESOURCE_RESULT_NOT_COMMITTED) 
        { 
            t.pResource->Release(); 
            t.pResource = CreateTexture(t.Width, t.Height, t.Mips); 
        }  

        // If the surface lost its content (either because it was discarded, or recreated 
        // due to lost commitment), we must regenerate the content. 

        if(Result != DXGI_RECLAIM_RESOURCE_RESULT_OK) 
        { 
            PopulateContent(t); 
        } 
    } 
} 

需求

   
目標平台 Windows
標頭 dxgi1_5.h
程式庫 Dxgi.lib
Dll Dxgi.dll

另請參閱

DXGI_RECLAIM_RESOURCE_RESULTS

IDXGIDevice4