2009-06-17 6 views
2

フルスクリーンモードでDirectX10(Win32/C++)アプリケーションを設定する際に少し問題があります。問題は、最初からフルスクリーンでアプリを稼働させたいということです。これは、DXGISwapChain :: SetFullScreenState関数を使用して行うことができます。これは動作しますが、私は述べている私のVisualC++ 2008デバッガで小さな通知を得る:D3D10(DirectX10)フルスクリーンパフォーマンスの問題

「DXGI警告:IDXGISwapChain ::現在:原因IDXGISwapChainを使用していないアプリケーションを被るフルスクリーンプレゼンテーションの非効率性::適切ResizeBuffers、DXGI_MODE_DESCを指定しませんIDXGIOutput :: GetDisplayModeListで使用可能か、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 
+0

あなたは第二部をしましたか? "DXXI_MODE_DESCをIDXGIOutput :: GetDisplayModeListで利用できないように指定する" – Ricket

+0

個人的には、これよりも多くのDirectXの専門知識があるので、これをGameDev.Netにポストすることをお勧めします。 – Promit

答えて

0

あなたはモードDESCを削除何らかの理由はありますか?

あなたは "FindClosestMatchingMode"を通してあなたのモードを入れてみましたか?

チェックアウトhttp://msdn.microsoft.com/en-us/library/cc627095(VS.85).aspx「フルスクリーンの問題」には多くの有用な情報が含まれています。

0

(最も効率的なフルスクリーンプレゼンテーションモードである)DXGIにフリップ有効にするためのいくつかの前提条件があります

1)あなたがシステム内に存在するモードを指定するフルスクリーン状態に入る必要があるが、(あなたはどちらかそれを行うことができIDXGIOutput :: GetDisplayModeListのモードを使用するか、IDXGIOutput :: FindClosestMatchingModeを使用して検索します。あなたのコードは画面解像度を指定するだけなので、最も可能性の高いモードが正しく設定されています。

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

そして、ええ、MSDNは、フルスクリーンの移行を含めDXGI慣行についての良い記事があります。 http://msdn.microsoft.com/en-us/library/cc627095(VS.85).aspx#Full_Screen_Issues