2

我在将我的 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
4

2 回答 2

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

于 2009-07-16T05:09:23.660 回答
0

你有什么理由删除你的模式描述吗?

您是否也尝试过将模式描述置于“FindClosestMatchingMode”?

查看http://msdn.microsoft.com/en-us/library/cc627095(VS.85).aspx “全屏问题”部分包含很多有用的信息。

于 2009-07-01T08:12:34.960 回答