перечисление DXGI_SWAP_EFFECT (dxgi.h)

Параметры обработки пикселей на поверхности дисплея после вызова IDXGISwapChain1::P resent1.

Синтаксис

typedef enum DXGI_SWAP_EFFECT {
  DXGI_SWAP_EFFECT_DISCARD = 0,
  DXGI_SWAP_EFFECT_SEQUENTIAL = 1,
  DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL = 3,
  DXGI_SWAP_EFFECT_FLIP_DISCARD = 4
} ;

Константы

 
DXGI_SWAP_EFFECT_DISCARD
Значение: 0
Используйте этот флаг, чтобы указать модель передачи битовых блоков (bitblt) и указать, что DXGI отменяет содержимое обратного буфера после вызова IDXGISwapChain1::P resent1.
Этот флаг действителен для цепочки буферов с несколькими обратными буферами, хотя приложения имеют доступ только для чтения и записи к буферу 0.
Используйте этот флаг, чтобы позволить драйверу дисплея выбрать наиболее эффективный метод представления для цепочки буферов.

Direct3D 12: Это значение перечисления никогда не поддерживается. Приложения D3D12 должны использовать DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL или DXGI_SWAP_EFFECT_FLIP_DISCARD.

Примечание Существуют различия между полноэкранным эксклюзивным и полноэкранным UWP. Если вы переносите приложение Direct3D 11 в UWP на компьютере с Windows, имейте в виду, что при создании цепочек буферов используется DXGI_SWAP_EFFECT_DISCARD.
В UWP ведет себя не так же, как в Win32, и его использование может отрицательно сказаться на производительности GPU.

Это связано с тем, что приложения UWP принудительно переходят в режимы переключения FLIP (даже если заданы другие режимы переключения), так как это сокращает объем вычислений.
время, используемое копиями памяти, изначально выполненными более старой моделью bitblt.

Рекомендуется вручную преобразовать цепочки буферов DX11 Для использования моделей flip в UWP, используя DXGI_SWAP_EFFECT_FLIP_DISCARD вместо DXGI_SWAP_EFFECT_DISCARD , где это возможно.
Дополнительные сведения см. в приведенном ниже примере.

 
DXGI_SWAP_EFFECT_SEQUENTIAL
Значение: 1
Используйте этот флаг, чтобы указать модель bitblt и указать, что DXGI сохраняет содержимое заднего буфера после вызова IDXGISwapChain1::P resent1.
Используйте этот параметр для представления содержимого цепочки буферов в порядке от первого буфера (буфера 0) до последнего буфера.
Этот флаг нельзя использовать с несколькими выборками.

Direct3D 12: Это значение перечисления никогда не поддерживается. Приложения D3D12 должны использовать DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL или DXGI_SWAP_EFFECT_FLIP_DISCARD.


Примечание Для оптимальной производительности используйте DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL вместо DXGI_SWAP_EFFECT_SEQUENTIAL. Дополнительные сведения см. в этой статье.

 
DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL
Значение: 3
Используйте этот флаг, чтобы указать модель представления flip и указать, что DXGI сохраняет содержимое заднего буфера после вызова IDXGISwapChain1::P resent1. Этот флаг нельзя использовать с несколькими выборками.


Direct3D 11: Это значение перечисления поддерживается начиная с Windows 8.
DXGI_SWAP_EFFECT_FLIP_DISCARD
Значение: 4
Используйте этот флаг, чтобы указать модель представления flip и указать, что DXGI отменяет содержимое обратного буфера после вызова IDXGISwapChain1::P resent1.
Этот флаг нельзя использовать с несколькими выборками и частичным представлением.
См. улучшения DXGI 1.4.


Direct3D 11: Это значение перечисления поддерживается начиная с Windows 10.
Этот флаг действителен для цепочки буферов с несколькими обратными буферами; хотя приложения имеют доступ на чтение и запись только к буферу 0.


Примечание Приложения Магазина Windows должны использовать DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL или DXGI_SWAP_EFFECT_FLIP_DISCARD.

 

Комментарии

Это перечисление используется структурами DXGI_SWAP_CHAIN_DESC и DXGI_SWAP_CHAIN_DESC1 .

В D3D12 поддерживаются только DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL и DXGI_SWAP_EFFECT_FLIP_DISCARD , а модели bitblt — нет. Из-за этого в D3D12 не поддерживается мультисамплинг заднего буфера, и необходимо вручную выполнить многомерную выборку в приложении с помощью ID3D12GraphicsCommandList::ResolveSubresource или ID3D12GraphicsCommandList1::ResolveSubresourceRegion.

Чтобы использовать multisampling с DXGI_SWAP_EFFECT_SEQUENTIAL или DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, необходимо выполнить мультисамплинг в отдельном целевом объекте отрисовки. Например, создайте текстуру с несколькими выборками, вызвав ID3D11Device::CreateTexture2D с заполненной структурой D3D11_TEXTURE2D_DESC (для элемента BindFlags задано значение D3D11_BIND_RENDER_TARGET и элемента SampleDesc с параметрами multisampling). Затем вызовите ID3D11Device::CreateRenderTargetView , чтобы создать целевое представление для текстуры и преобразовать сцену в текстуру. Наконец, вызовите ID3D11DeviceContext::ResolveSubresource , чтобы разрешить текстуру с несколькими выборками в цепочку буферов без нескольких шаблонов.

Основное различие между моделями представления заключается в том, как содержимое обратного буфера попадает в диспетчер окон рабочего стола (DWM) для композиции. В модели bitblt, которая используется со значениями DXGI_SWAP_EFFECT_DISCARD и DXGI_SWAP_EFFECT_SEQUENTIAL , содержимое обратного буфера копируется в область перенаправления при каждом вызове IDXGISwapChain1::P resent1. В модели flip, которая используется с DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL значением, все задние буферы совместно используются dwm. Таким образом, DWM может создаваться непосредственно из этих задних буферов без каких-либо дополнительных операций копирования. Как правило, модель flip является более эффективной. Модель flip также предоставляет больше возможностей, таких как расширенная текущая статистика.

Разница между DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL и DXGI_SWAP_EFFECT_FLIP_DISCARD заключается в том, что DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL заставляет DXGI гарантировать сохранение содержимого каждого обратного буфера в IDXGISwapChain::Present вызовах, в то время как DXGI_SWAP_EFFECT_FLIP_DISCARD не предоставляет этой гарантии. Композитатор в некоторых сценариях может использовать DirectFlip, где он использует задний буфер приложения в качестве всего обратного буфера отображения, что приводит к затратам на копирование обратного буфера приложения в конечный задний буфер рабочего стола. При использовании DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL и DXGI_SWAP_EFFECT_FLIP_DISCARD эта оптимизация может произойти, если приложение является единственным элементом, видимым на экране. Тем не менее, даже если приложение не является единственным видимым элементом на экране, если модель flip DXGI_SWAP_EFFECT_FLIP_DISCARD, композитатор может в некоторых сценариях по-прежнему выполнять эту оптимизацию, рисуя другое содержимое в задний буфер приложения.

При вызове IDXGISwapChain1::P resent1 в цепочке буферов модели flip (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL) с 0, указанным в параметре SyncInterval, поведение IDXGISwapChain1::P resent1 аналогично поведению IDirect3DDdevice9Ex::P resentEx с D3DSWAPEFFECT_FLIPEX и D3DPRESENT_FORCEIMMEDIATE. То есть среда выполнения не только представляет следующий кадр, а не все ранее поставленные в очередь кадры, но и завершает оставшееся время, оставшееся на ранее поставленных в очередь кадрах.

Независимо от того, является ли модель flip более эффективной, приложение по-прежнему может выбрать модель bitblt, так как bitblt-модель является единственным способом сочетать презентацию GDI и DirectX. В модели flip приложение должно создать цепочку буферов с DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE, а затем явно использовать GetDC в заднем буфере. После первого успешного вызова IDXGISwapChain1::P resent1 в цепочке буферов модели flip GDI больше не работает с HWND , связанным с этой цепочкой буферов, даже после разрушения цепочки буферов. Это ограничение распространяется даже на такие методы , как ScrollWindowEx.

Дополнительные сведения о цепочке буферов и оптимизации представления см. в статье Улучшение представления с помощью модели flip, грязное прямоугольников и прокручиваемых областей.

Примеры

Чтобы создать цепочку буферов в UWP, достаточно создать новый экземпляр шаблона DX11 и посмотреть на реализацию в примерах DeviceResources::CreateWindowSizeDependentResourcesD3D12.

DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0};

       swapChainDesc.Width = lround(m_d3dRenderTargetSize.Width);    // Match the size of the window.
       swapChainDesc.Height = lround(m_d3dRenderTargetSize.Height);
       swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;            // This is the most common swap chain format.
       swapChainDesc.Stereo = false;
       swapChainDesc.SampleDesc.Count = 1;                           // Don't use multi-sampling.
       swapChainDesc.SampleDesc.Quality = 0;
       swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
       swapChainDesc.BufferCount = 2;                                // Use double-buffering to minimize latency.
       swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;     // All Windows Store apps must use a flip effect.
       swapChainDesc.Flags = 2048;
       swapChainDesc.Scaling = scaling;
       swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_IGNORE;

       // This sequence obtains the DXGI factory that was used to create the Direct3D device above.
       ComPtr<IDXGIDevice3> dxgiDevice;
       DX::ThrowIfFailed(m_d3dDevice.As(&dxgiDevice));

       ComPtr<IDXGIAdapter> dxgiAdapter;
       DX::ThrowIfFailed(dxgiDevice->GetAdapter(&dxgiAdapter));

       ComPtr<IDXGIFactory4> dxgiFactory;
       DX::ThrowIfFailed(dxgiAdapter->GetParent(IID_PPV_ARGS(&dxgiFactory)));

       ComPtr<IDXGISwapChain1> swapChain;
       DX::ThrowIfFailed(
              dxgiFactory->CreateSwapChainForCoreWindow(
                     m_d3dDevice.Get(),
                     reinterpret_cast<IUnknown*>(m_window.Get()),
                     &swapChainDesc,
                     nullptr,
                     &swapChain
                     )
              );

Требования

Требование Значение
Заголовок dxgi.h

См. также раздел

Перечисления DXGI

Для достижения оптимальной производительности используйте модель переворачивания DXGI.