是否需要在 D3D12 中释放视图?(如果你不这样做,它们会导致泄漏吗?



我从本指南中学习DirectX12,有一件事让我感到困惑,那就是当他们调整深度缓冲区时。以下是他们的做法:

void Tutorial2::ResizeDepthBuffer(int width, int height)
{
if (m_ContentLoaded)
{
// Flush any GPU commands that might be referencing the depth buffer.
Application::Get().Flush(); //this here wait for any pending command lists to finish execution on the command queue
width = std::max(1, width);
height = std::max(1, height);
auto device = Application::Get().GetDevice();
// Resize screen dependent resources.
// Create a depth buffer.
D3D12_CLEAR_VALUE optimizedClearValue = {};
optimizedClearValue.Format = DXGI_FORMAT_D32_FLOAT;
optimizedClearValue.DepthStencil = { 1.0f, 0 };

ThrowIfFailed(device->CreateCommittedResource(
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
D3D12_HEAP_FLAG_NONE,
&CD3DX12_RESOURCE_DESC::Tex2D(DXGI_FORMAT_D32_FLOAT, width, height,
1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL),
D3D12_RESOURCE_STATE_DEPTH_WRITE,
&optimizedClearValue,
IID_PPV_ARGS(&m_DepthBuffer)
));
// Update the depth-stencil view.
D3D12_DEPTH_STENCIL_VIEW_DESC dsv = {};
dsv.Format = DXGI_FORMAT_D32_FLOAT;
dsv.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2D;
dsv.Texture2D.MipSlice = 0;
dsv.Flags = D3D12_DSV_FLAG_NONE;
device->CreateDepthStencilView(m_DepthBuffer.Get(), &dsv,
m_DSVHeap->GetCPUDescriptorHandleForHeapStart());
}
}

我们是否必须释放旧的Depth/Stencil视图,因为在上面的代码中,他们只是用新视图(CreateDepthStencilView(覆盖描述符堆中的描述符,而不是释放旧视图?那是泄漏吗?

这是指向代码的github链接

(如果它在描述符中(在描述符堆中(,而只是一个基于堆栈的视图,我是否需要释放这两个视图,如果需要,如何释放?(

SRV、CBV、UAV、RTV和DSV"视图";在DirectX 12中,它们在内存中被分配到的堆"拥有"。如果你愿意,你可以重复使用这些插槽。Create*View方法只是将数据填充到该内存中。当相关联的堆被释放时,内存本身也被释放。

顶点缓冲区和索引缓冲区视图也只是简单的结构。

您需要确保发布的引用计数部分是ID3D12Resource和ID3D12Heap对象。

除此教程外,您可能还想了解DX12的DirectX工具包。

相关内容

最新更新