我在将我的 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 不会完全拥有显卡并将图像从前缓冲区翻转到后缓冲区,而是对它们进行 blit,这要慢得多。
现在,我确实启用了 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