Variable Aktualisierungsrate wird angezeigt
Variable Aktualisierungsraten erfordern Reißen aktiviert werden müssen, dies wird auch als "vsync-off"-Unterstützung bezeichnet.
Variable Aktualisierungsrate zeigt/Vsync deaktiviert
Die Unterstützung für die Anzeige variabler Aktualisierungsrate wird erreicht, indem bestimmte Flags beim Erstellen und Darstellen der Swapchain festgelegt werden.
Um dieses Feature verwenden zu können, müssen sich App-Benutzer auf Windows 10-Systemen befinden, auf dem entweder KB3156421 oder das Anniversary Update installiert ist. Das Feature funktioniert in allen Versionen von Direct3D 11 und 12 mit DXGI_SWAP_EFFECT_FLIP_* Swap effects.
Wenn Sie Ihren Apps vsync-off-Unterstützung hinzufügen möchten, können Sie auf ein vollständiges Beispiel für Direct3D 12, D3D12Fullscreen- verweisen (siehe Working Samples). Es gibt auch einige Punkte, die nicht explizit im Beispielcode genannt werden, aber Sie müssen darauf achten.
- ResizeBuffers (oder ResizeBuffers1) muss das gleiche Swapchainerstellungsflagge (DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING) aufweisen, wie Present (oder Present1).
- DXGI_PRESENT_ALLOW_TEARING kann nur mit Synchronisierungsintervall 0 verwendet werden. Es wird empfohlen, dieses Zerreißen immer zu übergeben, wenn Synchronisierungsintervall 0 verwendet wird, wenn CheckFeatureSupport meldet, dass das Zerreißen unterstützt wird, und sich die App in einem Fenstermodus befindet – einschließlich rahmenlosem Vollbildmodus. Weitere Informationen finden Sie in den DXGI_PRESENT Konstanten.
- Durch das Deaktivieren von vsync wird die Framerate nicht unbedingt aufgehoben: Entwickler müssen außerdem sicherstellen, dass Präsentieren Aufrufe nicht durch andere Anzeigedauerereignisse gedrosselt werden (z. B. das
CompositionTarget::Rendering
-Ereignis in einer XAML-basierten App).
Der folgende Code enthält einige wichtige Elemente, die Sie Zu Ihren Apps hinzufügen müssen.
//--------------------------------------------------------------------------------------------------------
// 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));
Verwandte Themen