2009-06-17 47 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