1

たとえば、次のコードでは:

ID3D11Texture2D* texture2d; 

    HRESULT result = mSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*) &texture2d);//mSwapChain is a swap chain, as obvious

    result = mDevice->CreateRenderTargetView(texture2d, 0, &mTargetView);

    texture2d->Release();

release を呼び出した後、スワップチェーンのバックバッファがどうなるか、本当に混乱しています。現時点では、バックバッファー自体に影響を与えることなく、ポインターが解放されている可能性があります。ただし、概念を理解するのが難しいため、より精巧な回答が必要です。

4

1 に答える 1

6

テクスチャ オブジェクトは、それが持つ「参照」の数の内部カウントを維持します。最初にコードが開始されると、スワップチェーンは内部的にテクスチャへのポインタを持っているため、参照カウントは 1 になります。

ポインターが返されると、オブジェクトへの参照が 2 つになります。

swapchain::GetBuffer の内部のコードは、ポインタを返す前にテクスチャの AddRef 関数を呼び出すことによって、これを手動で行うことに注意してください。

したがって、Release all を呼び出すと、参照カウントが 1 つ減り、「ああ、まだ参照が 1 つあるので、他には何もしません」と言います。

テクスチャで Release を呼び出す前にスワップ チェーン オブジェクトが削除されていた場合、テクスチャへの参照が「解放」されているため、Release を呼び出すと、テクスチャの参照カウントがゼロに減少し、次のようになります。 「ああ、もう誰も私を使わない、私は自分自身を削除します!」.

したがって、基本的には、テクスチャに対して Release を呼び出すことは、テクスチャにもう興味がないことを伝えているだけです。誰もがそれを言うまで、それはまだ記憶に残っています.

于 2012-11-07T10:57:00.917 に答える