enumeración DXGI_SWAP_EFFECT (dxgi.h)
Opciones para controlar píxeles en una superficie de visualización después de llamar a IDXGISwapChain1::P resent1.
Syntax
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
} ;
Constantes
DXGI_SWAP_EFFECT_DISCARD Valor: 0 Use esta marca para especificar el modelo de transferencia de bloques de bits (bitblt) y para especificar que DXGI descarte el contenido del búfer de reserva después de llamar a IDXGISwapChain1::P resent1. Esta marca es válida para una cadena de intercambio con más de un búfer de reserva, aunque las aplicaciones solo tienen acceso de lectura y escritura al búfer 0. Use esta marca para permitir que el controlador de pantalla seleccione la técnica de presentación más eficaz para la cadena de intercambio. Direct3D 12: Este valor de enumeración nunca se admite. Las aplicaciones D3D12 deben usar DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL o DXGI_SWAP_EFFECT_FLIP_DISCARD.
Nota Hay diferencias entre la pantalla completa exclusiva y la UWP de pantalla completa. Si vas a migrar una aplicación direct3D 11 a UWP en un equipo Windows, ten en cuenta que el uso de DXGI_SWAP_EFFECT_DISCARD al crear cadenas de intercambio no se comporta de la misma manera en UWP que en Win32, y su uso puede ser perjudicial para el rendimiento de la GPU. Esto se debe a que las aplicaciones para UWP se ven forzadas a los modos de intercambio FLIP (incluso si se establecen otros modos de intercambio), ya que esto reduce el cálculo. tiempo utilizado por las copias de memoria realizadas originalmente por el modelo bitblt anterior. El enfoque recomendado es convertir manualmente cadenas de intercambio DX11 Descartar para usar modelos flip dentro de UWP, usando DXGI_SWAP_EFFECT_FLIP_DISCARD en lugar de DXGI_SWAP_EFFECT_DISCARD siempre que sea posible. Consulte el ejemplo siguiente y consulte este artículo para obtener más información. |
DXGI_SWAP_EFFECT_SEQUENTIAL Valor: 1 Use esta marca para especificar el modelo bitblt y para especificar que DXGI conserve el contenido del búfer de reserva después de llamar a IDXGISwapChain1::P resent1. Use esta opción para presentar el contenido de la cadena de intercambio en orden, desde el primer búfer (búfer 0) hasta el último búfer. Esta marca no se puede usar con muestreo múltiple. Direct3D 12: Este valor de enumeración nunca se admite. Las aplicaciones D3D12 deben usar DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL o DXGI_SWAP_EFFECT_FLIP_DISCARD.
Nota Para obtener el mejor rendimiento, use DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL en lugar de DXGI_SWAP_EFFECT_SEQUENTIAL. Consulte este artículo para más información. |
DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL Valor: 3 Use esta marca para especificar el modelo de presentación invertida y para especificar que DXGI conserve el contenido del búfer de reserva después de llamar a IDXGISwapChain1::P resent1. Esta marca no se puede usar con muestreo múltiple. Direct3D 11: Este valor de enumeración se admite a partir de Windows 8. |
DXGI_SWAP_EFFECT_FLIP_DISCARD Valor: 4 Use esta marca para especificar el modelo de presentación invertida y para especificar que DXGI descarte el contenido del búfer de reserva después de llamar a IDXGISwapChain1::P resent1. Esta marca no se puede usar con el muestreo múltiple y la presentación parcial. Consulte Mejoras de DXGI 1.4. Direct3D 11: Este valor de enumeración se admite a partir de Windows 10. Esta marca es válida para una cadena de intercambio con más de un búfer de reserva; aunque las aplicaciones tienen acceso de lectura y escritura solo al búfer 0.
Nota Las aplicaciones de la Tienda Windows deben usar DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL o DXGI_SWAP_EFFECT_FLIP_DISCARD. |
Comentarios
Esta enumeración la usan las estructuras DXGI_SWAP_CHAIN_DESC y DXGI_SWAP_CHAIN_DESC1 .
En D3D12, solo se admiten DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL y DXGI_SWAP_EFFECT_FLIP_DISCARD , y los modelos bitblt no. Por este motivo, no se admite el muestreo múltiple de un búfer de reserva en D3D12 y debe realizar manualmente el muestreo múltiple en la aplicación mediante ID3D12GraphicsCommandList::ResolveSubresource o ID3D12GraphicsCommandList1::ResolveSubresourceRegion.
Para usar el muestreo múltiple con DXGI_SWAP_EFFECT_SEQUENTIAL o DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, debe realizar el muestreo múltiple en un destino de representación independiente. Por ejemplo, cree una textura de muestreo múltiple llamando a ID3D11Device::CreateTexture2D con una estructura de D3D11_TEXTURE2D_DESC rellena (miembro BindFlags establecido en D3D11_BIND_RENDER_TARGET y miembro SampleDesc con parámetros de muestreo múltiple). A continuación, llame a ID3D11Device::CreateRenderTargetView para crear una vista de destino de representación para la textura y representar la escena en la textura. Por último, llame a ID3D11DeviceContext::ResolveSubresource para resolver la textura multimuestreo en la cadena de intercambio no multimuestreo.
La principal diferencia entre los modelos de presentación es cómo el contenido del búfer de reserva llega al Administrador de ventanas de escritorio (DWM) para la composición. En el modelo bitblt, que se usa con los valores de DXGI_SWAP_EFFECT_DISCARD y DXGI_SWAP_EFFECT_SEQUENTIAL , el contenido del búfer de reserva se copia en la superficie de redireccionamiento en cada llamada a IDXGISwapChain1::P resent1. En el modelo de volteo, que se usa con el valor de DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL , todos los búferes de reserva se comparten con DWM. Por lo tanto, DWM puede componer directamente desde esos búferes de reserva sin ninguna operación de copia adicional. En general, el modelo de volteo es el modelo más eficaz. El modelo de volteo también proporciona más características, como estadísticas presentes mejoradas.
La diferencia entre DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL y DXGI_SWAP_EFFECT_FLIP_DISCARD es que DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL obliga a DXGI a garantizar que el contenido de cada búfer de reserva se conserva entre IDXGISwapChain::Present
llamadas, mientras que DXGI_SWAP_EFFECT_FLIP_DISCARD no proporciona esta garantía. El compositor, en ciertos escenarios, puede usar DirectFlip, donde usa el búfer de reserva de la aplicación como el búfer de reserva de la pantalla completa, que reduce el costo de copiar el búfer de reserva de la aplicación en el búfer back del escritorio final. Con DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL y DXGI_SWAP_EFFECT_FLIP_DISCARD, esta optimización puede producirse cuando la aplicación es el único elemento visible en la pantalla. Sin embargo, incluso cuando la aplicación no es el único elemento visible en la pantalla, si el modelo de volteo es DXGI_SWAP_EFFECT_FLIP_DISCARD, el compositor puede seguir realizando esta optimización, dibujando otro contenido en el búfer de reserva de la aplicación.
Al llamar a IDXGISwapChain1::P resent1 en una cadena de intercambio de modelos invertida (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL) con 0 especificado en el parámetro SyncInterval, el comportamiento de IDXGISwapChain1::P resent1 es el mismo que el comportamiento de IDirect3D 9Ex de Direct3DDevice9Ex::P resentEx con D3DSWAPEFFECT_FLIPEX y D3DPRESENT_FORCEIMMEDIATE. Es decir, el tiempo de ejecución no solo presenta el siguiente fotograma en lugar de los fotogramas en cola anteriores, también finaliza el tiempo restante que queda en los fotogramas en cola anteriormente.
Independientemente de si el modelo de volteo es más eficaz, una aplicación todavía podría elegir el modelo bitblt porque el modelo bitblt es la única manera de mezclar la presentación GDI y DirectX. En el modelo de volteo, la aplicación debe crear la cadena de intercambio con DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE y, a continuación, debe usar GetDC en el búfer de reserva explícitamente. Después de la primera llamada correcta a IDXGISwapChain1::P resent1 en una cadena de intercambio de modelo invertida, GDI ya no funciona con el HWND asociado a esa cadena de intercambio, incluso después de la destrucción de la cadena de intercambio. Esta restricción se extiende incluso a métodos como ScrollWindowEx.
Para obtener más información sobre la cadena de intercambio de modelos invertidos y la optimización de la presentación, consulta Mejorar la presentación con el modelo de volteo, rectángulos sucios y áreas desplazadas.
Ejemplos
Para crear una cadena de intercambio en UWP, solo tienes que crear una nueva instancia de la plantilla DX11 y ver la implementación de en los ejemplos de 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
)
);
Requisitos
Requisito | Valor |
---|---|
Header | dxgi.h |
Consulte también
Para obtener el mejor rendimiento, use el modelo de volteo DXGI.