2009-06-17 78 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上看過,但他們大多假設你只能通過按Alt + Enter進入全屏,以免DXGI完成所有工作。如果有人請發佈一些將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

你做第二部分? 「指定DXGI_MODE_DESC在IDXGIOutput :: GetDisplayModeList中不可用」 – Ricket 2009-06-17 16:57:54

回答

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