我在为全屏模式设置DirectX10(Win32 / c ++)应用程序时遇到了一些问题。问题是我希望我的应用程序从一开始就全屏运行。这可以通过DXGISwapChain :: SetFullScreenState函数来完成。这是有效的,但我在我的Visualc ++ 2008调试器中得到一个小注意事项:
“DXGI警告:IDXGISwapChain ::目前:由于应用程序未正确使用IDXGISwapChain :: ResizeBuffers,指定了IDXGIOutput :: GetDisplayModeList中不可用的DXGI_MODE_DESC,或者未使用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 :(得分:0)
你有没有理由删除你的模式desc?
您是否也尝试通过“FindClosestMatchingMode”设置模式desc?
结帐http://msdn.microsoft.com/en-us/library/cc627095(VS.85).aspx“全屏问题”部分包含大量有用信息。
答案 1 :(得分: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