Что такое ID3D12GraphicsCommandList :: DiscardResource? - PullRequest
0 голосов
/ 30 мая 2019

Что именно я должен ожидать при использовании DiscardResource ?

В чем разница между удалением и уничтожением / удалением ресурса.

Когда подходящее время / вариант использования для сброса ресурса?

К сожалению, Microsoft, похоже, мало о ней говорит, кроме как "отбрасывает ресурс".

1 Ответ

3 голосов
/ 31 мая 2019

TL; DR: Это редко используемая функция, которая предоставляет подсказку драйвера, связанную с обработкой прозрачных структур сжатия.Вы вряд ли будете его использовать, кроме как на основании конкретных рекомендаций по производительности.

DiscardResource - это версия DirectX 12 метода Direct3D 11.1.См. Документы Microsoft

Основное использование этих методов - оптимизация производительности графических частей отложенного растеризатора на основе тайлов путем отбрасывания цели рендеринга после ее появления.Это подсказка для драйвера, что содержимое цели рендеринга больше не относится к работе программы, поэтому при следующем использовании он может избежать некоторых внутренних операций очистки.

Для DirectX 11 этов шаблоне приложения DirectX 11 для использования DiscardView, поскольку он использует DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL:

void DX::DeviceResources::Present() 
{
    // The first argument instructs DXGI to block until VSync, putting the application
    // to sleep until the next VSync. This ensures we don't waste any cycles rendering
    // frames that will never be displayed to the screen.
    DXGI_PRESENT_PARAMETERS parameters = { 0 };
    HRESULT hr = m_swapChain->Present1(1, 0, &parameters);

    // Discard the contents of the render target.
    // This is a valid operation only when the existing contents will be entirely
    // overwritten. If dirty or scroll rects are used, this call should be removed.
    m_d3dContext->DiscardView1(m_d3dRenderTargetView.Get(), nullptr, 0);

    // Discard the contents of the depth stencil.
    m_d3dContext->DiscardView1(m_d3dDepthStencilView.Get(), nullptr, 0);

    // If the device was removed either by a disconnection or a driver upgrade, we 
    // must recreate all device resources.
    if (hr == DXGI_ERROR_DEVICE_REMOVED || hr == DXGI_ERROR_DEVICE_RESET)
    {
        HandleDeviceLost();
    }
    else
    {
        DX::ThrowIfFailed(hr);
    }
}

Шаблон приложения DirectX 12 не нуждается в этих явных вызовах, поскольку он использует DXGI_SWAP_EFFECT_FLIP_DISCARD.

Если вам интересно, почему приложение DirectX 11 не просто использует DXGI_SWAP_EFFECT_FLIP_DISCARD, скорее всего, так и должно быть.Эффект свопинга DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL был единственным, поддерживаемым Windows 8.x для приложений Магазина Windows, то есть с появлением DiscardView.Для Windows 10 / DirectX 12 / UWP, вероятно, лучше всегда использовать DXGI_SWAP_EFFECT_FLIP_DISCARD, если только вы не хотите, чтобы задний буфер отбрасывался.

Это также полезно для конфигураций SLI / Crossfire с несколькими GPU.поскольку операция очистки может потребовать синхронизации между графическими процессорами.См. этот доклад GDC 2015

. Существуют также и другие сценарии использования.Например, если вы выполняете отложенный рендеринг для G-буфера, где вы знаете, что каждый пиксель будет перезаписан, вы можете использовать DiscardResource вместо ClearRenderTargetView / ClearDepthStencilView.

...