Exibições de taxa de atualização variável

As exibições de taxa de atualização variável exigem que o tearing seja habilitado, isso também é conhecido como suporte "vsync-off".

Exibições de taxa de atualização variável/Vsync desativado

O suporte para exibições de taxa de atualização variável é obtido definindo determinados sinalizadores ao criar e apresentar a cadeia de troca.

Para usar esse recurso, os usuários do aplicativo precisam estar em sistemas Windows 10 com KB3156421 ou a Atualização de Aniversário instalada. O recurso funciona em todas as versões do Direct3D 11 e 12 usando efeitos de troca DXGI_SWAP_EFFECT_FLIP_* .

Para adicionar suporte ao vsync-off aos seus aplicativos, você pode consultar um exemplo de execução completo para Direct3D 12, D3D12Fullscreen (consulte Exemplos de trabalho). Também há alguns pontos não explicitamente chamados no código de exemplo, mas você precisa prestar atenção.

  • ResizeBuffers (ou ResizeBuffers1) deve ter o mesmo sinalizador de criação de cadeia de troca (DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING) passado para ele como Presente (ou Presente1).
  • DXGI_PRESENT_ALLOW_TEARING só pode ser usado com o intervalo de sincronização 0. É recomendável sempre passar esse sinalizador de interrupção ao usar o intervalo de sincronização 0 se CheckFeatureSupport relatar que há suporte para a interrupção e o aplicativo estiver em um modo em janelas , incluindo o modo de tela inteira sem borda. Consulte as constantes DXGI_PRESENT para obter mais detalhes.
  • Desabilitar o vsync não necessariamente cancela a taxa de quadros: os desenvolvedores também precisam garantir que as chamadas presentes não sejam limitadas por outros eventos de tempo (como o CompositionTarget::Rendering evento em um aplicativo baseado em XAML).

O código a seguir recapitula algumas partes principais que você precisa adicionar aos seus aplicativos.

//--------------------------------------------------------------------------------------------------------
// 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));

Melhorias do DXGI 1.5

Guia de programação para DXGI