2

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
4

2 に答える 2

0

モードの説明を削除する理由はありますか?

また、モードの説明を「FindClosestMatchingMode」に入れてみましたか?

http://msdn.microsoft.com/en-us/library/cc627095(VS.85).aspxを確認してください。「フルスクリーンの問題」セクションには、役立つ情報がたくさん含まれています。

于 2009-07-01T08:12:34.960 に答える
0

DXGI で反転を有効にするには、いくつかの前提条件があります (これは最も効率的なフルスクリーン プレゼンテーション モードです)。

1) システムに存在するモードを指定して、フルスクリーン状態にする必要があります (IDXGIOutput::GetDisplayModeList のモードを使用するか、IDXGIOutput::FindClosestMatchingMode を使用してモードを見つけることで実行できます)。あなたのコードは画面解像度を指定しているだけなので、おそらくモードは正しく設定されています。

2) SetFullscreenState の、適切なバッファー サイズ マッチング モードで ResizeBuffers を呼び出す必要があります。これは、DXGI がフリッピング モードを設定する場所です。通常、これは SetFullscreenState トランジションによって送信される WM_SIZE メッセージへの反応として自然に発生するはずなので、アプリが WM_SIZE で ResizeBuffers を呼び出さない場合は、おそらくそうすべきです。SetFullscreenState の後に ResizeBuffers を手動で呼び出すことができ、それも同様に機能するはずです。

そうです、 MSDNには、全画面遷移を含む DXGI プラクティスに関する優れた記事があります 。

于 2009-07-16T05:09:23.660 に答える