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 对象,然后仅在持有互斥时调用 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
Library Dxgi.lib
DLL Dxgi.dll

请参阅

DXGI_RECLAIM_RESOURCE_RESULTS

IDXGIDevice4