Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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::Renderingw 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));
Tematy pokrewne