Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Las cadenas de intercambio controlan la rotación de la memoria intermedia, formando la base de la animación de gráficos.
Visió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 para el programador de contar, por ejemplo, con compatibilidad con la rotación automática de recursos, presente en D3D10 y D3D11, ya no existe. Las aplicaciones con la rotación automática de recursos habilitada podían renderizar el mismo objeto de la API aunque la superficie real renderizada cambiara en 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 clave de color automática ni el multimuestreo, aunque cabe destacar que el estiramiento y la rotación sí siguen siendo compatibles.
Duración del búfer
Las aplicaciones pueden almacenar descriptores previamente creados que hacen referencia a búferes de retorno. Esto se habilita asegurándose de 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 buffers devueltos por IDXGISwapChain::GetBuffer no cambia hasta que se llaman a ciertas API:
El orden de los búferes devueltos por GetBuffer nunca cambia.
IDXGISwapChain3::GetCurrentBackBufferIndex devuelve el índice del búfer de retroceso 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, que requieren que el recuento de búferes sea mayor que uno.
Tip
Para juegos que busquen una latencia de entrada mínima, crea la cadena de intercambio con DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING y, a continuación, llama a Present(0, DXGI_PRESENT_ALLOW_TEARING). Esto omite la sincronización vertical (vsync) del compositor y proporciona la menor latencia entre la presentación y la visualización. En tiempo de ejecución, comprueba la compatibilidad con el tearing llamando a IDXGIFactory5::CheckFeatureSupport con DXGI_FEATURE_PRESENT_ALLOW_TEARING antes de utilizar esta ruta.
Warning
Un error común en el ritmo de fotogramas es llamar a Present(1, 0) (vsync activado) sin sincronizar adecuadamente el trabajo de la CPU con la barrera de la GPU. Esto hace que la CPU se adelante, acumulando una cola de fotogramas que aumenta la latencia de entrada. Utiliza siempre una barrera de recuento de fotogramas para limitar los fotogramas de la CPU en proceso (normalmente al recuento del búfer menos 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 a FSE sin los inconvenientes de rendimiento. Para obtener más información sobre FSO, consulta Demystifying Fullscreen Optimisations.
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 D3D11 flip-model tienen las mismas restricciones).
Las transiciones de IDXGISwapChain::SetFullscreenState no cambian el conjunto de búferes visibles para la aplicación en la cadena de intercambio. Solo los ResizeBuffers y ResizeTarget llamadas crean o destruyen búferes visibles para la aplicación. Sin embargo, en Direct3D 12 IDXGISwapChain::SetFullscreenState 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::Present o a IDXGISwapChain1::Present, el búfer posterior que se va a presentar debe estar en el estado D3D12_RESOURCE_STATE_PRESENT. La presentación fallará con DXGI_ERROR_INVALID_CALL si no es así.
Las cadenas de intercambio de pantalla completa siguen teniendo la restricción de que debe llamarse a SetFullscreenState(FALSE, NULL) antes de la liberación final de la cadena de intercambio. SetFullscreenState(FALSE) se ejecuta correctamente en cadenas de intercambio que se ejecutan en dispositivos con Direct3D 12.
Las operaciones de presentación se realizan en la cola 3D proporcionada al crear la cadena de intercambio, y las aplicaciones pueden presentar simultáneamente varias cadenas de intercambio, así como grabar 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, crear 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:
Warning
El ejemplo siguiente se simplifica para mayor claridad. Un bucle de juego en producción debe desacoplar las actualizaciones de la simulación de la frecuencia de renderizado —por ejemplo, utilizando un paso de tiempo fijo para la simulación mientras se renderiza lo más rápido posible— y utilizar una barrera para limitar los fotogramas en vuelo. Sin la limitación de fotogramas en vuelo, la función Present puede completarse inmediatamente en cadenas de intercambio de modelos flip, lo que permite a la CPU poner en cola fotogramas de forma ilimitada y aumentar la latencia de entrada.
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 en realidad requiere un puntero a una cola de comandos directa en Direct3D 12, y no a un dispositivo.
Presentación en Windows 7
Cuando se utiliza Direct3D 12 en Windows 7, no están presentes los tipos DXGI necesarios para Direct3D 12, por lo que debes utilizar el ID3D12CommandQueueDownLevel proporcionado por D3D12On7 (consultado a partir de la cola de comandos directa) para la presentación.
Proporcionas una lista de comandos abierta al método presente de Windows 7, que se usará, cerrará y enviará automáticamente al dispositivo. Debes proporcionar un búfer de fondo que debe ser creado por la aplicación, debe ser un recurso confirmado, debe ser de muestreo único y debe tener 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