Frequenza di aggiornamento variabile visualizza

La frequenza di aggiornamento delle variabili richiede l'abilitazione della lacrima , nota anche come supporto "vsync-off".

Frequenza di aggiornamento variabile visualizzata/Vsync disattivata

Il supporto per la frequenza di aggiornamento variabile viene raggiunto impostando determinati flag durante la creazione e la presentazione della catena di scambio.

Per usare questa funzionalità, gli utenti dell'app devono trovarsi in sistemi Windows 10 con KB3156421 o l'aggiornamento dell'anniversario installato. La funzionalità funziona su tutte le versioni di Direct3D 11 e 12 usando effetti di scambio DXGI_SWAP_EFFECT_FLIP_* .

Per aggiungere il supporto vsync-off alle app, è possibile fare riferimento a un esempio di esecuzione completo per Direct3D 12, D3D12Fullscreen (vedere Esempi di lavoro). Esistono anche alcuni punti non chiamati in modo esplicito nel codice di esempio, ma è necessario prestare attenzione.

  • ResizeBuffers (o ResizeBuffers1) deve avere lo stesso flag di creazione della catena di scambio (DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING) passato a esso come Present (o Present1).
  • DXGI_PRESENT_ALLOW_TEARING può essere usato solo con l'intervallo di sincronizzazione 0. È consigliabile passare sempre questo flag di strappo quando si usa l'intervallo di sincronizzazione 0 se CheckFeatureSupport segnala che l'estrazione è supportata e l'app è in modalità finestra, inclusa la modalità schermo intero senza bordo. Per altre informazioni, vedere le costanti DXGI_PRESENT .
  • La disabilitazione di vsync non implica necessariamente la frequenza dei fotogrammi: gli sviluppatori devono anche assicurarsi che le chiamate presenti non siano limitate da altri eventi di intervallo, ad esempio l'evento CompositionTarget::Rendering in un'app basata su XAML.

Il codice seguente recape alcuni pezzi chiave che è necessario aggiungere alle app.

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

Miglioramenti di DXGI 1.5

Guida alla programmazione per DXGI