DirectX10 (Win32/c++) アプリケーションをフルスクリーン モードに設定するのに少し問題があります。問題は、アプリを最初からフルスクリーンで実行したいということです。これは、DXGISwapChain::SetFullScreenState 関数を使用して行うことができます。これは機能しますが、Visualc++ 2008 デバッガーに次のような小さな通知が表示されます。
「DXGI 警告: IDXGISwapChain::Present: アプリケーションが IDXGISwapChain::ResizeBuffers を適切に使用していない、IDXGIOutput::GetDisplayModeList で使用できない DXGI_MODE_DESC を指定している、または DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH を使用していないことが原因で、全画面表示の非効率性が発生しました。」
これが意味することは、DirectX がグラフィックス カードの完全な所有権を取得せず、画像をフロント バッファからバック バッファにフリップするのではなく、それらをブリットするため、はるかに低速になるということです。
今、私は DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH を有効にしており、バッファーのサイズを変更しようとしましたが、フルスクリーン モードに入る最善の方法がまったくわかりません。私はMSDNを見てきましたが、ほとんどの場合、DXGIがすべての作業を行わないように、Alt + Enterを押すだけでフルスクリーンに入ることが想定されています。誰かが DirectX10 をフルスクリーン モードにし、「フリッピング」を最大限に活用するコードを少し投稿していただければ、非常に高く評価されます。
サイズ変更で使用されるコードに興味がある人向け:
ReleaseCOM(m_pD3DRenderTargetView);
ReleaseCOM(m_pD3DDepthStencilView);
ReleaseCOM(m_pD3DDepthStencilBuffer);
DXGI_MODE_DESC* mod = new DXGI_MODE_DESC;
mod->Format = DXGI_FORMAT_R8G8B8A8_UNORM;
mod->Height = m_ScreenHeight;
mod->Width = m_ScreenWidth;
mod->RefreshRate.Denominator = 0;
mod->RefreshRate.Numerator = 0;
mod->ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
mod->Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
delete mod; mod = 0;
m_pSwapChain->ResizeTarget(mod);
HR(m_pSwapChain->ResizeBuffers(1, m_ScreenWidth, m_ScreenHeight, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH))
throw(Exception(GET_BUFFER_FAIL, AT));
//problem area
m_pSwapChain->SetFullscreenState(TRUE, NULL);
ID3D10Texture2D* pBackBuffer;
HR( m_pSwapChain->GetBuffer(0, __uuidof(ID3D10Texture2D), (LPVOID*)&pBackBuffer))
throw(Exception(GET_BUFFER_FAIL, AT)); //continues as usual