Compartir a través de


Cadenas de intercambio

Las cadenas de intercambio controlan la rotación del búfer de reserva, formando la base de la animación de gráficos.

Información general

El modelo de programación para cadenas de intercambio en Direct3D 12 no es idéntico al de versiones anteriores de D3D. La comodidad de programación, por ejemplo, de admitir la rotación automática de recursos que estaba presente en D3D10 y D3D11 ya no se admite. La rotación automática de recursos habilita las aplicaciones para representar el mismo objeto de API mientras la superficie real que se representa cambia cada fotograma. El comportamiento de las cadenas de intercambio se cambia con Direct3D 12 para permitir que otras características de Direct3D 12 tengan una sobrecarga de CPU baja. No se admiten la tecla de color automática y el muestreo múltiple, aunque todavía se extienden y rotan.

Duración del búfer

Las aplicaciones pueden almacenar descriptores creados previamente que hacen referencia a los búferes de reserva. Esto está habilitado al garantizar que el conjunto de búferes propiedad de una cadena de intercambio nunca cambia durante la vigencia de la cadena de intercambio. El conjunto de búferes devuelto por IDXGISwapChain::GetBuffer no cambia hasta que se llama a determinadas API:

El orden de los búferes devueltos por GetBuffer nunca cambia.

IDXGISwapChain3::GetCurrentBackBufferIndex devuelve el índice del búfer de reserva actual a la aplicación.

Efectos de intercambio

Los únicos efectos de intercambio admitidos son DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL y DXGI_SWAP_EFFECT_FLIP_DISCARD, lo que requiere que el recuento de búferes sea mayor que uno.

Transición entre los modos de pantalla completa y ventana

Direct3D 12 no admite el modo exclusivo de pantalla completa (FSE). En su lugar, cuando un juego es la única aplicación visible en pantalla, el sistema operativo usa una estrategia denominada optimizaciones de pantalla completa (FSO) para lograr un efecto similar al FSE sin las desventajas de rendimiento. Para obtener más información sobre FSO, consulta Optimizaciones de pantalla completa de desmitificación.

Direct3D 12 mantiene la restricción de que las aplicaciones deben llamar a ResizeBuffers después de realizar la transición entre los modos de pantalla completa y ventana (las cadenas de intercambio de modelo invertido D3D11 tienen las mismas restricciones).

Las transiciones IDXGISwapChain::SetFullscreenState no cambian el conjunto de búferes visibles para la aplicación en la cadena de intercambio. Solo las llamadas ResizeBuffers y ResizeTarget crean o destruyen los búferes visibles para la aplicación. Sin embargo, en IdXGISwapChain::SetFullscreenState de Direct3D 12 no entra en modo exclusivo de pantalla completa y simplemente cambia las resoluciones y las velocidades de actualización para permitir optimizaciones de pantalla completa. Estos cambios se pueden realizar mediante una aplicación sin el uso de este método

Cuando se llama a IDXGISwapChain::P resent o IDXGISwapChain1::P resent , el búfer de reserva que se va a presentar debe estar en estado D3D12_RESOURCE_STATE_PRESENT . Se producirá un error en la DXGI_ERROR_INVALID_CALL si no es así.

Las cadenas de intercambio de pantalla completa siguen teniendo la restricción de que se debe llamar a SetFullscreenState(FALSE, NULL) antes de la versión final de la cadena de intercambio. SetFullscreenState(FALSE) se ejecuta correctamente en cadenas de intercambio que se ejecutan en dispositivos Direct3D 12.

Las operaciones actuales se producen en la cola 3D proporcionada en la creación de la cadena de intercambio, y las aplicaciones pueden presentar simultáneamente varias cadenas de intercambio y registrar y ejecutar listas de comandos.

Cuando la parte final del trabajo de gráficos (por ejemplo, postprocesamiento de fotogramas) se realiza en una cola de proceso o no implica la cola de gráficos del dispositivo, la creación de una segunda cola 3D en la que presentarse puede ser beneficiosa y evitar la latencia de la presentación retrasando el inicio del siguiente fotograma.

Ejemplo

El código de ejemplo siguiente estaría presente en el bucle de representación principal:

void Present()
{
    m_swapChain->Present(0, m_presentFlags);
    m_backBufferIndex = (m_backBufferIndex + 1) % m_backBufferCount;
}

Creación de cadenas de intercambio

Al usar las llamadas CreateSwapChainForHwnd, CreateSwapChainForCoreWindow o CreateSwapChainForComposition , tenga en cuenta que el parámetro pDevice realmente requiere un puntero a una cola de comandos directa en Direct3D 12 y no a un dispositivo.

Presentación en Windows 7

Cuando el destino es Direct3D 12 en Windows 7, los tipos DXGI necesarios para Direct3D 12 no están presentes, por lo que debes usar el ID3D12On7 proporcionado por D3D12CommandQueueDownLevel (consultado fuera de la cola de comandos directo) para presentar.

Proporcionas una lista de comandos abierta al método presente de Windows 7, que se usará, cerrará y enviará automáticamente al dispositivo automáticamente. Debe proporcionar un búfer de reserva que debe crearse en la aplicación, debe ser un recurso confirmado, debe ser de muestra única y debe ser uno de los siguientes formatos.

  • DXGI_FORMAT_R16G16B16A16_FLOAT
  • DXGI_FORMAT_R10G10B10A2_UNORM
  • DXGI_FORMAT_R8G8B8A8_UNORM
  • DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
  • DXGI_FORMAT_B8G8R8X8_UNORM
  • DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM
  • DXGI_FORMAT_B8G8R8A8_UNORM
  • DXGI_FORMAT_B8G8R8A8_UNORM_SRGB