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

Do Views need to be deallocated in D3D12? (Will they cause a leak if you don't?)

我正在根据本指南学习 DirectX12 here,让我感到困惑的一件事是他们调整深度缓冲区的大小时。以下是他们的做法:

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) 覆盖描述符堆中的描述符,而不是释放旧视图?那是泄漏吗?

这是githublink的代码

(如果它在描述符中(在描述符堆中)与仅基于堆栈的视图相比,我是否需要解除分配它们,如果需要如何解除分配?)

DirectX 12 中的 SRV、CBV、UAV、RTV 和 DSV“视图”按它们分配到的堆存储在内存中 'owned'。如果需要,您可以重复使用这些插槽。 Create*View 方法只是将数据填充到该内存中。当关联的堆被释放时,内存本身也被释放。

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

您需要确保释放的 ref-counted 部分是 ID3D12Resource 和 ID3D12Heap 对象。

In addition to that tutorial, you may want to take a look at DirectX Tool Kit for DX12.