D3D11退出全屏模式时的资源泄漏问题

      当你的D3D11程序在全屏模式时,如果由于某种原因导致全屏模式被终止而转换到窗口模式,则有可能会造成ID3D11Device设备无法释放。

比如当一个窗口从另外的显示器拖到全屏显示显示器时,或者在全屏程序中弹出一个对话框时,都会造成程序退出全屏模式。

此时IDXGISwapChain的Present会返回DXGI_STATUS_OCCLUDED。正常情况下在Present后,ID3D11Device设备的引用计数会减少。但有时引用计数不变。这样的话就会造成资源的泄漏。


UINT GetRef( IUnknown * iun )

  UINT nRef = 0;

  if ( iun )
  {
    iun->AddRef();
      nRef = iun->Release();
      }

  return nRef;
}

 


// ......

UINT nRef1 = GetRef( pd3dDevice );

HRESULT hr = pSwapChain->Present( 1, flags );
 
if ( DXGI_STATUS_OCCLUDED == h )
{

  m_bOccluded = TRUE;

  // ...
 
  UINT2 nRef2 = GetRef( pd3dDevice );

  if ( nRef2 != nRef1 - 1  )

  {
        // 此时说明 pd3dDevice 的一个引用没有被释放,因此在最后程序退出时无法完成ID3D11Device的释放。

    // ...

  }
  // ...
}

// ...

 

//

// 现在的办法是在程序退出时强制释放ID3D11Device接口

//

UINT nRef = m_pd3dDevice->Release();
while ( nRef > 0 )
{
  nRef = m_pd3dDevice->Release();
}

 


 

转载于:https://www.cnblogs.com/Perit/archive/2012/09/03/2668774.html

IDXGIOutput1是DirectX Graphics Infrastructure (DXGI)的一部分,是用于描述显卡输出设备的接口之一。其中,DuplicateOutput方法用于将一个显示器的图像内容复制到另一个显示器中。其函数原型如下: ``` HRESULT DuplicateOutput( _In_ IUnknown *pDevice, _Out_ HANDLE *pOutputDuplication ); ``` 其中,pDevice参数表示用于复制输出的设备。通常情况下,可以将它设置为NULL,表示使用当前默认的设备。pOutputDuplication参数是一个输出参数,用于返回复制输出的句柄。 调用DuplicateOutput方法,需要满足以下条件: 1. 当前显卡驱动必须支持DXGI 1.2或更高版本。 2. 调用该方法的进程必须具有D3D11_CREATE_DEVICE_BGRA_SUPPORT标志。 3. 调用该方法的进程必须具有管理员权限或者是一个交互式用户进程。 如果这些条件都满足,DuplicateOutput方法将会创建一个输出复制对象,用于捕获并复制源输出的内容。可以通过调用输出复制对象的AcquireNextFrame方法来获取下一帧的图像内容,并通过调用输出复制对象的ReleaseFrame方法来释放该帧。需要注意的是,复制输出对象只能捕获全屏输出,无法捕获单独的窗口。 下面是一个简单的示例代码,展示了如何使用IDXGIOutput1接口的DuplicateOutput方法来复制显示器的输出: ``` Microsoft::WRL::ComPtr<IDXGIOutput1> dxgiOutput1; HANDLE hOutputDuplication = nullptr; HRESULT hr = dxgiOutput->DuplicateOutput(nullptr, &hOutputDuplication); if (SUCCEEDED(hr)) { // 成功创建输出复制对象 // 可以使用hOutputDuplication句柄来获取输出内容 } else { // 创建输出复制对象失败 } ``` 需要注意的是,在使用完输出复制对象后,需要调用它的Release方法来释放内存。同,需要及调用Release方法来释放dxgiOutput1对象的内存,以免造成内存泄漏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值