Отображение переменной частоты обновления

Для отображения переменной частоты обновления требуется включить разрыв , это также называется поддержкой vsync-off.

Отображение переменной частоты обновления или выключение Vsync

Поддержка отображения переменной частоты обновления достигается путем установки определенных флагов при создании и представлении цепочки буферов.

Чтобы использовать эту функцию, пользователи приложений должны находиться в системах Windows 10 с установленным обновлением KB3156421 или Юбилейным обновлением. Эта функция работает во всех версиях Direct3D 11 и 12 с помощью эффектов замены DXGI_SWAP_EFFECT_FLIP_* .

Чтобы добавить поддержку vsync-off для приложений, можно обратиться к полному работающему примеру для Direct3D 12, D3D12Fullscreen (см. рабочие примеры). В примере кода также есть несколько моментов, но необходимо обратить внимание на них.

  • ResizeBuffers (или ResizeBuffers1) должен иметь тот же флаг создания цепочки буферов (DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING), переданный ему как Present (или Present1).
  • DXGI_PRESENT_ALLOW_TEARING можно использовать только с интервалом синхронизации 0. Этот флаг разрыва рекомендуется всегда передавать при использовании интервала синхронизации 0, если CheckFeatureSupport сообщает о том, что слезоточивость поддерживается , и приложение находится в окне в режиме полноэкранного режима, включая режим полноэкранного режима без границ. Дополнительные сведения см. в константах DXGI_PRESENT .
  • Отключение vsync не обязательно отменяет частоту кадров: разработчикам также необходимо убедиться, что вызовы present не регулируются другими событиями времени (например CompositionTarget::Rendering , событием в приложении на основе XAML).

Приведенный ниже код содержит несколько ключевых элементов, которые необходимо добавить в приложения.

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

Руководство по программированию для DXGI