释放 CreateTexture2D() 获取的内存?

Release memory aquired by CreateTexture2D()?

因为 MSDN 在这一点上不是很具体:在我的应用程序中,我通过调用 CreateTexture2D() 创建了一个纹理。

成功后,是否必须释放创建的纹理?如果是,如何?

谢谢!

TL;DR: 本文在 MSDN 上有记录:Programming DirectX with COM

Direct3D 使用 COM 引用计数进行生命周期管理。

  • 所有对象都派生自 IUnknown,并且在创建它们时引用计数为 1。

  • 当您调用 Release 时,它会减少引用计数。一旦 refcount 为 0,该对象就有资格清理其所有内存和资源使用。出于性能原因,Direct3D 使用延迟销毁,因此通常所有这些对象都会在一两帧后被清除。

Once the "external" refcount is 0, the Direct3D Runtime will deal with cleaning it up. You don't have to do anything else. If you want to force all deferred destruction, you can use ID3D11DeviceContext::Flush, but you shouldn't do it often as it severely impacts performance.

  • 如果你想让多个指针引用同一个对象,你调用AddRef来增加它的引用计数。

  • 对于 Direct3D 10、11 和 12,COM 生命周期规则略有修改。具体来说,如果“设备”的引用计数为 0,则从该设备创建的所有“设备子对象”都是无效的,即使 它们的 引用计数不为零。

  • 对于 Direct3D 10、11 和 12,如果您 'bind' 一个对象到渲染管道,这 不会 增加引用计数。您必须确保对象在渲染完成之前保持有效。参见 Reference Counting (Direct3D 10)

对于 C++ 开发,强烈建议使用某种 COM 智能指针来根据需要自动 increment/decrement 引用计数。这里的选项包括:

  • WRL 的 Microsoft::WRL::ComPtr**
  • C++/WinRT 的 winrt::com_ptr
  • WIL 的 wil::com_ptr

为了完整起见,还有:

  • ATL 的 CComPtrWRL 基本上是“ATL 2.0”,并且 ATL 仅作为选择加入功能 Visual Studio 安装
  • Visual Studio的_com_ptr_t半心半意的尝试,所以不是很好的选择

** = This is my preference currently since it's available in the Windows 8.0 SDK or later and works for Win32 desktop, UWP, and Xbox. See DirectX Tool Kit Wiki: ComPtr for reasoning and examples.

另见 MSDN: Managing Object Lifetimes Through Reference Counting and Wikipedia: Reference counting