2017-05-07 2 views
2

Ich habe DirectX11 UWP-Anwendung. Ich erstelle Swap-Chain mit IDXGIFactory2::CreateSwapChainForCoreWindow und üblichen Parametern.Wie reduziert man die Präsentationslatenz der Swap-Kettendarstellung in der UWP-Anwendung?

::DXGI_SWAP_CHAIN_DESC1 desc{}; 
desc.Width    = back_buffer_width; 
desc.Height    = back_buffer_height; 
desc.Format    = DXGI_FORMAT_B8G8R8A8_UNORM; 
desc.SampleDesc.Count = 1; 
desc.SampleDesc.Quality = 0; 
desc.BufferUsage  = DXGI_USAGE_RENDER_TARGET_OUTPUT; 
desc.BufferCount  = 2; 
desc.SwapEffect   = DXGI_SWAP_EFFECT_FLIP_DISCARD; 
desc.Flags    = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH | DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT; 
desc.Scaling   = DXGI_SCALING_NONE; 
desc.AlphaMode   = DXGI_ALPHA_MODE_IGNORE; 
::Microsoft::WRL::ComPtr<::IDXGISwapChain1> p_swap_chain; 
Validate_OkResult 
(
    p_dxgi_factory->CreateSwapChainForCoreWindow 
    (
     p_d3d_device.Get() 
    , reinterpret_cast< ::IUnknown * >(h_window) // passing ::Windows::UI::Core::CoreWindow^
    , ::std::addressof(desc) 
    , nullptr 
    , &p_swap_chain 
    ) 
); 
Validate_OkResult(p_swap_chain->SetMaximumFrameLatency(1)); // 1 is minimum allowed value 

Wenn ich versuche, es in Vollbild-Modus von ::IDXGISwapChain::SetFullscreenState es mit DXGI_ERROR_NOT_CURRENTLY_AVAILABLE nicht Aufruf zu ändern, und ich bin die folgende Diagnose bekommen:

DXGI ERROR: IDXGISwapChain::SetFullscreenState: Core Window SwapChains cannot transition to fullscreen, as they are considered perpetually windowed. [ MISCELLANEOUS ERROR #163: ]

DXGI ERROR: IDXGISwapChain::SetFullscreenState: For modern applications, fullscreen is not available. All swapchains must be windowed. [ MISCELLANEOUS ERROR #206: ]

ich, dass ich durch die Verwendung Vollbild-Modus heraus umschalten ApplicationView:

::Windows::UI::ViewManagement::ApplicationView^h_view(::Windows::UI::ViewManagement::ApplicationView::GetForCurrentView()); 
if(h_view->IsFullScreenMode) 
{ 
    h_view->ExitFullScreenMode(); 
} 
else 
{ 
    h_view->TryEnterFullScreenMode(); 
} 

jedoch dieses Verfahren nur Taskleiste versteckt, verbirgt Fensterrahmen und maximiert das Fenster. Ich dachte, dass es mit Flip-Model-Präsentation in diesem Fall möglich sein sollte, Vorteile der üblichen Fullscreen-Swap-Ketten mit niedriger Latenzzeit zu erzielen, aber das scheint nicht zu funktionieren, und die Swap-Kette wird weiterhin zusammengesetzt. Composited Flip wird immer noch für die Präsentation verwendet und die Darstellungsverzögerung bleibt gleich ~ 30 ms wie im Fenstermodus. Muss ich die Komposition vollständig deaktivieren oder gibt es eine andere Methode, um eine zusätzliche Latenz zu vermeiden, die durch die Komposition angewendet wird?

Antwort

0

Nach einigem Experimentieren habe ich eine Lösung gefunden: Das Deaktivieren von System-Overlays zusätzlich zur Zeigervisualisierung deaktiviert die Komposition im Vollbildmodus und die Präsentation wird als unabhängige Spiegelung ausgeführt. Der folgende Code sollte in ::Windows::ApplicationModel::Core::IFrameworkView::SetWindow Methode Implementierung hinzugefügt werden:

::Windows::UI::Input::PointerVisualizationSettings^h_visualization_settings{::Windows::UI::Input::PointerVisualizationSettings::GetForCurrentView()}; 
h_visualization_settings->IsContactFeedbackEnabled = false; 
h_visualization_settings->IsBarrelButtonFeedbackEnabled = false; 
::Windows::UI::ViewManagement::ApplicationView^h_view{::Windows::UI::ViewManagement::ApplicationView::GetForCurrentView()}; 
h_view->FullScreenSystemOverlayMode = ::Windows::UI::ViewManagement::FullScreenSystemOverlayMode::Minimal; 

Beachten Sie, dass es nicht Overlays vollständig deaktivieren ist, es zeigt nur eine kleine Bar zunächst, dass die Bedürfnisse Benutzer klicken Sie auf den entsprechenden Overlay Element zeigen, wie Taskleiste .

Verwandte Themen