Direct3D COM接口发布的顺序是否重要?

时间:2016-11-13 18:25:32

标签: c++ com direct3d

作为一个例子考虑这个结构

struct Foo
{
    ComPtr<ID3D11Texture2D> back_buffer;
    ComPtr<IDXGISwapChain> swap_chain;
    ComPtr<ID3D11DeviceContext> device_context;
    ComPtr<ID3D11Device> device;
}

此处的release()调用顺序与创建这些COM对象的顺序相同。它会引起任何问题吗?

1 个答案:

答案 0 :(得分:3)

通常,严格来说COM对象的释放顺序并不重要。也就是说,Direct3D在生命周期内并没有使用严格的COM规则。一旦你发布了对Direct3D设备的最后一个引用,那么无论它们的个人引用数量是多少,那么该设备的子对象的所有内容都是无效的。

为了使清理更容易一些,有“对象泄漏检测”。在Direct3D调试设备中,因此在释放最终设备实例之前干净地释放所有内容是有帮助的。请参阅Direct3D SDK Debug Layer TricksDXGI Debug Device

请记住,对象到对象的引用也可以使计数保持活跃状态​​,并且Direct3D可以使用延迟销毁&#39;。因此,一个干净的出口&#39;取消绑定所有对象后需要刷新:

m_d3dContext->ClearState();
m_d3dContext->Flush();
// Release all your objects except the device
// Final release of the device here
  

你不必使用这样一个清晰的&amp;使用Direct3D 11进行清理以进行清理,但是您最终会收到很多错误的报告和#39;如果您在解除绑定后没有Flush,则通过调试层实现活动对象。使用Direct3D 12,您必须确保GPU处于空闲状态,然后才能开始发布以便彻底退出。