作为一个例子考虑这个结构
struct Foo
{
ComPtr<ID3D11Texture2D> back_buffer;
ComPtr<IDXGISwapChain> swap_chain;
ComPtr<ID3D11DeviceContext> device_context;
ComPtr<ID3D11Device> device;
}
此处的release()调用顺序与创建这些COM对象的顺序相同。它会引起任何问题吗?
答案 0 :(得分:3)
通常,严格来说COM对象的释放顺序并不重要。也就是说,Direct3D在生命周期内并没有使用严格的COM规则。一旦你发布了对Direct3D设备的最后一个引用,那么无论它们的个人引用数量是多少,那么该设备的子对象的所有内容都是无效的。
为了使清理更容易一些,有“对象泄漏检测”。在Direct3D调试设备中,因此在释放最终设备实例之前干净地释放所有内容是有帮助的。请参阅Direct3D SDK Debug Layer Tricks和DXGI 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处于空闲状态,然后才能开始发布以便彻底退出。