Se muestra la frecuencia de actualización variable

La frecuencia de actualización variable muestra que requiere que se habilite el desgarro , lo que también se conoce como compatibilidad con "vsync-off".

Frecuencia de actualización variable muestra/Vsync desactivado

La compatibilidad con las pantallas de frecuencia de actualización variable se logra estableciendo determinadas marcas al crear y presentar la cadena de intercambio.

Para usar esta característica, los usuarios de la aplicación deben estar en sistemas Windows 10 con KB3156421 o la actualización de aniversario instalada. La característica funciona en todas las versiones de Direct3D 11 y 12 con efectos de intercambio DXGI_SWAP_EFFECT_FLIP_* .

Para agregar compatibilidad con vsync-off a las aplicaciones, puedes consultar un ejemplo completo de ejecución para Direct3D 12, D3D12Fullscreen (consulta Ejemplos de trabajo). También hay algunos puntos que no se resaltan explícitamente en el código de ejemplo, pero debe prestar atención.

  • ResizeBuffers (o ResizeBuffers1) debe tener la misma marca de creación de cadena de intercambio (DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING) pasada a él como Presente (o Present1).
  • DXGI_PRESENT_ALLOW_TEARING solo se puede usar con el intervalo de sincronización 0. Se recomienda pasar siempre esta marca de desgarro cuando se usa el intervalo de sincronización 0 si CheckFeatureSupport informa de que se admite el desgarro y la aplicación está en modo de ventana, incluido el modo de pantalla completa sin bordes. Consulte las constantes de DXGI_PRESENT para obtener más detalles.
  • Deshabilitar vsync no necesariamente quita la velocidad de fotogramas: los desarrolladores también deben asegurarse de que las llamadas presentes no están limitadas por otros eventos de control de tiempo (como el CompositionTarget::Rendering evento en una aplicación basada en XAML).

El código siguiente vuelve a resumir algunas partes clave que debe agregar a las aplicaciones.

//--------------------------------------------------------------------------------------------------------
// Check Tearing Support
//--------------------------------------------------------------------------------------------------------

// Determines whether tearing support is available for fullscreen borderless windows.

void DXSample::CheckTearingSupport()
{
// Rather than create the 1.5 factory interface directly, we create the 1.4
// interface and query for the 1.5 interface. This will enable the graphics
// debugging tools which might not support the 1.5 factory interface.

    ComPtr<IDXGIFactory4> factory4;
    HRESULT hr = CreateDXGIFactory1(IID_PPV_ARGS(&factory4));
    BOOL allowTearing = FALSE;
    if (SUCCEEDED(hr))
    { 
        ComPtr<IDXGIFactory5> factory5;
        hr = factory4.As(&factory5);
        if (SUCCEEDED(hr))
        {
            hr = factory5->CheckFeatureSupport(DXGI_FEATURE_PRESENT_ALLOW_TEARING, &allowTearing, sizeof(allowTearing));
        }
    }
    m_tearingSupport = SUCCEEDED(hr) && allowTearing;
}

//--------------------------------------------------------------------------------------------------------
// Set up swapchain properly
//--------------------------------------------------------------------------------------------------------

// It is recommended to always use the tearing flag when it is supported.
swapChainDesc.Flags = m_tearingSupport ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0;

//--------------------------------------------------------------------------------------------------------
// Present
//--------------------------------------------------------------------------------------------------------

UINT presentFlags = (m_tearingSupport && m_windowedMode) ? DXGI_PRESENT_ALLOW_TEARING : 0;

// Present the frame.
ThrowIfFailed(m_swapChain->Present(0, presentFlags));

Mejoras de DXGI 1.5

Guía de programación para DXGI