2016-11-13 1 views
1

この構造体リリースされたDirect3D COMインターフェイスの順序は重要ですか?例として

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

解放の順序を(検討)これらのCOMオブジェクトが作成された順序と同じで、ここで呼び出します。それは何か問題を引き起こすことができますか?

答えて

3

一般に、COMオブジェクトのリリースの順序は厳密には重要ではありません。つまり、Direct3Dは生涯にわたって厳密なCOMルールを使用しません。 Direct3Dデバイスへの最後の参照を解放すると、個々の参照カウントが何であっても、そのデバイスの子オブジェクトであるものはすべて無効になります。

クリーンアップをやりやすくするために、Direct3Dデバッグデバイスに「オブジェクトリーク検出」があります。最終デバイスインスタンスを解放する前に、すべてを完全に解放すると便利です。 Direct3D SDK Debug Layer TricksおよびDXGI Debug Deviceを参照してください。

オブジェクトからオブジェクトへの参照でもカウントが有効になり、Direct3Dでは「遅延破壊」が使用されることに注意してください。そのため、「クリーン終了は、」あなたはすべてのオブジェクトのバインドを解除した後、フラッシュを必要とします。

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

あなたはDirect3Dの11でクリーンアップのために、このような明確な&フラッシュを使用する必要はありませんが、あなたは終わるだろうデバッグレイヤーによってライブオブジェクトの多くの「虚偽のレポート」が表示される場合は、アンバインド後にFlushを実行してください。 Direct3D 12では、クリーンな終了を得るためにリリースを開始する前に、GPUがアイドル状態であることを確認する必要があります。

関連する問題