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, ¶meters);
// 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
.