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".
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));