当我们调用IUknown :: Release时会发生什么

时间:2012-11-07 06:38:42

标签: directx directx-11

例如,在以下代码中:

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后,swapchain中的backbuffer会发生什么。在我认为可能发生的那一刻,指针被释放,而不影响后备缓冲器本身。我需要一个更详细的答案,因为我很难理解这个概念。

1 个答案:

答案 0 :(得分:4)

纹理对象保持其具有的“引用”数量的内部计数。最初,当您的代码启动时,交换链内部有一个指向纹理的指针,因此它的引用计数为1.

当它返回一个指向你的指针时,现在有两个对该对象的引用。

请注意,swapchain :: GetBuffer内部的代码通过调用纹理的AddRef函数手动执行此操作,然后再将指针返回给您。

因此,当您调用Release all时,它会将引用计数减1,然后说“啊,还有一个引用,所以我什么都不做。”

如果在纹理上调用Release之前删除了交换链对象,它就会“释放”它对纹理的引用,所以当你调用Release时它会将纹理的引用数减少到零而且它会说“啊,没有人再使用我了,我会删除自己!”。

所以基本上你在纹理上调用Release就是你告诉纹理你不再对它感兴趣了。它仍会在记忆中流传,直到每个人都告诉它。