Wyświetlana zmienna częstotliwość odświeżania

Wyświetlanie zmiennej częstotliwości odświeżania wymaga włączenia rozerwania. Jest to również nazywane obsługą "vsync-off".

Wyświetlana zmienna częstotliwość odświeżania/wyłączona funkcja Vsync

Obsługa wyświetlania zmiennej częstotliwości odświeżania jest osiągana przez ustawienie niektórych flag podczas tworzenia i prezentowania łańcucha wymiany.

Aby korzystać z tej funkcji, użytkownicy aplikacji muszą znajdować się w systemach Windows 10 z zainstalowanym KB3156421 lub rocznicowej aktualizacji. Funkcja działa we wszystkich wersjach direct3D 11 i 12 przy użyciu DXGI_SWAP_EFFECT_FLIP_* efektów zamiany.

Aby dodać obsługę funkcji vsync-off do aplikacji, możesz zapoznać się z kompletnym uruchomionym przykładem dla wersji Direct3D 12, D3D12Fullscreen (zapoznaj się z roboczymi przykładami). Istnieje również kilka punktów, które nie są jawnie wywoływane w przykładowym kodzie, ale należy zwrócić uwagę na to.

  • ResizeBuffers (lub ResizeBuffers1) musi mieć tę samą flagę tworzenia łańcucha wymiany (DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING) przekazaną do niej jako Present (lub Present1).
  • DXGI_PRESENT_ALLOW_TEARING można używać tylko z interwałem synchronizacji 0. Zaleca się zawsze przekazywanie tej flagi rozdzierania w przypadku korzystania z interwału synchronizacji 0, jeśli CheckFeatureSupport raportów, że rozdzieranie jest obsługiwane i aplikacja jest w trybie okna — w tym trybie pełnoekranowym bez obramowania. Aby uzyskać więcej informacji, zobacz stałe DXGI_PRESENT.
  • Wyłączenie synchronizacji wirtualnej nie musi wyrejeścić szybkości klatek: deweloperzy muszą również upewnić się, że Wywołania nie są ograniczane przez inne zdarzenia chronometrażu (takie jak zdarzenie CompositionTarget::Rendering w aplikacji opartej na języku XAML).

Poniższy kod zawiera kilka kluczowych elementów, które należy dodać do aplikacji.

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

ulepszenia DXGI 1.5

Przewodnik programowania dla DXGI