Variable refresh rate displays(변수 새로 고침 빈도 표시)

가변 새로 고침 빈도 표시를 사용하려면 눈물을 사용하도록 설정해야 합니다. 이를 "vsync-off" 지원이라고도 합니다.

가변 새로 고침 빈도 표시/Vsync 끄기

스왑 체인을 만들고 표시할 때 특정 플래그를 설정하여 가변 새로 고침 빈도 표시를 지원합니다.

이 기능을 사용하려면 앱 사용자가 KB3156421 또는 1주년 업데이트가 설치된 Windows 10 시스템에 있어야 합니다. 이 기능은 DXGI_SWAP_EFFECT_FLIP_* 스왑 효과를 사용하여 모든 버전의 Direct3D 11 및 12에서 작동합니다.

앱에 vsync-off 지원을 추가하려면 Direct3D 12, D3D12Fullscreen ( 작업 샘플 참조)에 대한 전체 실행 샘플을 참조할 수 있습니다. 샘플 코드에서 명시적으로 호출되지 않은 몇 가지 점도 있지만 주의해야 합니다.

  • ResizeBuffers (또는 ResizeBuffers1)에는 Present (또는 Present1)와 동일한 스왑 체인 생성 플래그(DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING)가 전달되어야 합니다.
  • DXGI_PRESENT_ALLOW_TEARING 동기화 간격 0에서만 사용할 수 있습니다. CheckFeatureSupport에서 눈물이 지원되고 앱이 테두리 없는 전체 화면 모드를 포함하여 창 모드에 있다고 보고하는 경우 동기화 간격 0을 사용할 때 항상 이 눈물 플래그를 전달하는 것이 좋습니다. 자세한 내용은 DXGI_PRESENT 상수를 참조하세요.
  • vsync를 사용하지 않도록 설정해도 프레임 속도의 캡슐화가 반드시 해제되는 것은 아닙니다. 개발자는 Present 호출이 다른 타이밍 이벤트(예: XAML 기반 앱의 CompositionTarget::Rendering 이벤트)에 의해 제한되지 않도록 해야 합니다.

아래 코드는 앱에 추가해야 하는 몇 가지 주요 부분을 요약합니다.

//--------------------------------------------------------------------------------------------------------
// 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 Improvements(DXGI 1.5 개선 사항)

DXGI 프로그래밍 가이드