DirectX11 UWP アプリケーションがあります。IDXGIFactory2::CreateSwapChainForCoreWindow
通常のパラメーターを使用してスワップ チェーンを作成します。
::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
呼び出してフルスクリーン モードに変更しようとする::IDXGISwapChain::SetFullscreenState
と失敗しDXGI_ERROR_NOT_CURRENTLY_AVAILABLE
、次の診断が表示されます。
DXGI エラー: IDXGISwapChain::SetFullscreenState: コア ウィンドウ SwapChains は、永続的にウィンドウ化されていると見なされるため、フルスクリーンに移行できません。[ その他のエラー #163: ]
DXGI エラー: IDXGISwapChain::SetFullscreenState: 最新のアプリケーションでは、フルスクリーンは使用できません。すべてのスワップチェーンはウィンドウ化する必要があります。[ その他のエラー #206: ]
次を使用してフルスクリーンモードを切り替えることができることがわかりましたApplicationView
:
::Windows::UI::ViewManagement::ApplicationView ^ h_view(::Windows::UI::ViewManagement::ApplicationView::GetForCurrentView());
if(h_view->IsFullScreenMode)
{
h_view->ExitFullScreenMode();
}
else
{
h_view->TryEnterFullScreenMode();
}
ただし、このメソッドはタスクバーを非表示にし、ウィンドウ フレームを非表示にし、ウィンドウを最大化するだけです。この場合、フリップ モデル プレゼンテーションを使用すると、通常のフルスクリーン スワップ チェーンの低レイテンシの利点を得ることができるはずですが、それは 2 つの機能ではないようで、スワップ チェーンは引き続き合成されます。コンポジット フリップは引き続きプレゼンテーションに使用され、プレゼンテーション ラグはウィンドウ モードと同じ ~30ms のままです。コンポジションを完全に無効にする必要がありますか、それともコンポジションによって適用される余分なレイテンシーを回避する他の方法がありますか?