Anzeige der variablen Aktualisierungsrate

Anzeige mit variabler Aktualisierungsrate erfordert die Aktivierung des Tearings . Dies wird auch als "vsync-off"-Unterstützung bezeichnet.

Anzeige der variablen Aktualisierungsrate/Vsync deaktiviert

Unterstützung für Anzeige mit variabler Aktualisierungsrate wird erreicht, indem beim Erstellen und Darstellen der Swapchain bestimmte Flags festgelegt werden.

Um dieses Feature verwenden zu können, müssen sich App-Benutzer auf Windows 10 Systemen befinden, auf denen kb3156421 oder das Anniversary Update installiert ist. Das Feature funktioniert in allen Versionen von Direct3D 11 und 12 mit DXGI_SWAP_EFFECT_FLIP_* -Swapeffekten.

Wenn Sie Ihren Apps vsync-off-Unterstützung hinzufügen möchten, können Sie sich ein vollständiges Beispiel für die Ausführung von Direct3D 12, D3D12Fullscreen ansehen (siehe Arbeitsbeispiele). Es gibt auch einige Punkte, die im Beispielcode nicht explizit genannt werden, aber Sie müssen darauf achten.

  • ResizeBuffers (oder ResizeBuffers1) muss über das gleiche Swapchainerstellungsflag (DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING) als Present (oder Present1) übergeben werden.
  • DXGI_PRESENT_ALLOW_TEARING können nur mit Synchronisierungsintervall 0 verwendet werden. Es wird empfohlen, dieses Tearing-Flag immer zu übergeben, wenn Synchronisierungsintervall 0 verwendet wird, wenn CheckFeatureSupport meldet, dass das Tearing unterstützt wird und sich die App in einem Fenstermodus befindet , einschließlich des rahmenlosen Vollbildmodus. Weitere Informationen finden Sie unter DXGI_PRESENT Konstanten.
  • Die Deaktivierung von vsync hebt nicht unbedingt die Framerate auf: Entwickler müssen auch sicherstellen , dass Present-Aufrufe nicht durch andere Zeitsteuerungsereignisse gedrosselt werden (z. B. das CompositionTarget::Rendering Ereignis in einer XAML-basierten App).

Der folgende Code enthält einige wichtige Elemente, die Sie Ihren Apps hinzufügen müssen.

//--------------------------------------------------------------------------------------------------------
// 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 Verbesserungen

Programmierhandbuch für DXGI