一般に、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がアイドル状態であることを確認する必要があります。