перечисление 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 для использования моделей переверки в 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.
Чтобы использовать многосамплинг с DXGI_SWAP_EFFECT_SEQUENTIAL или DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, необходимо выполнить многосамплинг в отдельном целевом объекте отрисовки. Например, создайте многофакторную текстуру путем вызова ID3D11Device::CreateTexture2D с заполненной структурой D3D11_TEXTURE2D_DESC (BindFlags с набором элементов D3D11_BIND_RENDER_TARGET и sampleDesc с несколькими параметрами). Затем вызовите ID3D11Device::CreateRenderTargetView, чтобы создать представление целевого объекта отрисовки для текстуры и отобразить сцену в текстуре. Наконец, вызовите ID3D11DeviceContext::ResolveSubresource, чтобы разрешить многофакторную текстуру в цепочку буферов без нескольких меток.
Основное различие между моделями презентаций заключается в том, как содержимое буфера обратного буфера получается в диспетчере окон рабочего стола (DWM) для композиции. В модели bitblt, которая используется со значениями DXGI_SWAP_EFFECT_DISCARD и DXGI_SWAP_EFFECT_SEQUENTIAL, содержимое обратного буфера копируется в область перенаправления при каждом вызове IDXGISwapChain1::P resent1. В модели переверки, которая используется со значением DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, все буферы обратно используются для DWM. Таким образом, DWM может создавать прямо из этих задних буферов без каких-либо дополнительных операций копирования. Как правило, модель переверки является более эффективной моделью. Модель переверки также предоставляет дополнительные функции, такие как улучшенная текущая статистика.
Разница между 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эта оптимизация может произойти, когда приложение является единственным элементом, видимым на экране. Однако даже если приложение не является единственным видимым элементом на экране, если модель переверки DXGI_SWAP_EFFECT_FLIP_DISCARD, компостатор может в некоторых сценариях по-прежнему выполнять эту оптимизацию, нарисовав другое содержимое в заднем буфере приложения.
При вызове IDXGISwapChain1::P resent1 в цепочке буферов модели переверки (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL) с 0, указанным в параметре syncInterval SyncInterval, поведение IDXGISwapChain1::P resent1совпадает с поведением Direct3D 9ExIDirect3DDevice9Ex::P resentEx с D3DSWAPEFFECT_FLIPEX и D3DPRESENT_FORCEIMMEDIATE. То есть среда выполнения не только представляет следующий кадр вместо всех ранее очередных кадров, он также завершает любое оставшееся время на ранее очередных кадрах.
Независимо от того, эффективнее ли модель переверки, приложение по-прежнему может выбрать модель bitblt, так как модель bitblt является единственным способом смешивания презентации GDI и DirectX. В модели переверки приложение должно создать цепочку буферов с DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE, а затем использовать GetDC в обратном буфере явным образом. После первого успешного вызова IDXGISwapChain1::P resent1 в цепочке буферов с помощью модели переверки GDI больше не работает с HWND, связанной с этой цепочкой буферов, даже после уничтожения цепочки буферов. Это ограничение даже распространяется на методы, такие как ScrollWindowEx.
Для отображения форматов буфера цепочки буферов HDR и цветовых пространств требуется модель переверки. В противном случае они собираются (и обрезаются) в SDR (sRGB с диапазоном 0-1).
Дополнительные сведения о цепочке буферов с помощью перевернутой модели и оптимизации презентации см. в разделе Улучшение презентации с помощью модели переверки, грязных прямоугольников и прокрученных областей.
Примеры
Чтобы создать цепочку буферов в UWP, просто необходимо создать новый экземпляр шаблона DX11 и просмотреть реализацию DeviceResources::CreateWindowSizeDependentResources
в примерах D3D12.
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