Compartir a través de


Se muestra la frecuencia de actualización variable

Las pantallas de frecuencia de actualización variable requieren desgarro habilitar, esto 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 DXGI_SWAP_EFFECT_FLIP_* efectos de intercambio.

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

  • ResizeBuffers (o ResizeBuffers1) deben tener la misma marca de creación de cadena de intercambio (DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING) que 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 elimina la velocidad de fotogramas: los desarrolladores también deben asegurarse de que las llamadas presentes no están limitadas por otros eventos de tiempo (como el evento CompositionTarget::Rendering 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));

DXGI 1.5 Improvements

Guía de programación de para DXGI