D3D10(DirectX10)全屏性能问题

D3D10(DirectX10)全屏性能问题,directx,performance,fullscreen,directx-10,Directx,Performance,Fullscreen,Directx 10,我在设置DirectX10(Win32/c++)应用程序的全屏模式时遇到了一些问题。问题是我想让我的应用程序从一开始就全屏运行。这可以通过使用DXGISwapChain::SetFullScreenState函数来实现。这是可行的,但我在Visualc++2008调试器中收到一个小提示,其中指出: “DXGI警告:IDXGISwapChain::Present:由于应用程序未正确使用IDXGISwapChain::ResizeBuffers、指定IDXGIOutput::GetDisplayMo

我在设置DirectX10(Win32/c++)应用程序的全屏模式时遇到了一些问题。问题是我想让我的应用程序从一开始就全屏运行。这可以通过使用DXGISwapChain::SetFullScreenState函数来实现。这是可行的,但我在Visualc++2008调试器中收到一个小提示,其中指出:

“DXGI警告:IDXGISwapChain::Present:由于应用程序未正确使用IDXGISwapChain::ResizeBuffers、指定IDXGIOutput::GetDisplayModeList中不可用的DXGI模式描述或未使用DXGI交换链标志允许模式开关,导致全屏演示效率低下。”

这意味着DirectX将不会完全拥有graphicscard并将图像从正面翻转到背面缓冲区,而是将它们进行blit,这要慢得多

现在,我确实启用了DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_开关,并且尝试调整缓冲区大小,但我完全不知道进入全屏模式的最佳方式是什么。我看过MSDN,但他们大多认为只有按Alt+Enter键才能进入全屏,否则DXGI会完成所有工作。如果有人可以发布一些代码,将DirectX10带入全屏模式,并充分利用“翻转”功能,那将是非常感谢的

对于任何对resize上使用的代码感兴趣的人:

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

您删除模式描述有什么原因吗

您是否也尝试过将模式描述设置为“FindClosesMatchingMode”


查看“全屏问题”部分包含大量有用的信息。

是否有任何理由删除模式描述

您是否也尝试过将模式描述设置为“FindClosesMatchingMode”


查看“全屏问题”部分,其中包含大量有用的信息。

在DXGI中启用翻转有一些先决条件(这是最有效的全屏演示模式):

1) 您应该进入全屏状态,指定系统中存在的模式(您可以通过使用IDXGIOutput::GetDisplayModeList中的模式或使用IDXGIOutput::FindClosestMatchingMode查找模式)。您的代码只是指定了屏幕分辨率,所以最有可能的模式设置正确

2) 在SetFullscreenState之后,应该使用正确的缓冲区大小匹配模式调用ResizeBuffers,这是DXGI设置翻转模式的地方。 通常,这应该是对SetFullscreenState transition发送的WM_SIZE消息的自然反应,所以如果你的应用程序没有调用WM_SIZE上的ResizeBuffers,它可能应该这样做。 您可以在SetFullscreenState之后手动调用ResizeBuffers,这也应该可以工作

是的,MSDN有一篇关于DXGI实践的好文章,包括全屏转换:

在DXGI(最有效的全屏演示模式)中启用翻转有一些先决条件:

1) 您应该进入全屏状态,指定系统中存在的模式(您可以通过使用IDXGIOutput::GetDisplayModeList中的模式或使用IDXGIOutput::FindClosestMatchingMode查找模式)。您的代码只是指定了屏幕分辨率,所以最有可能的模式设置正确

2) 在SetFullscreenState之后,应该使用正确的缓冲区大小匹配模式调用ResizeBuffers,这是DXGI设置翻转模式的地方。 通常,这应该是对SetFullscreenState transition发送的WM_SIZE消息的自然反应,所以如果你的应用程序没有调用WM_SIZE上的ResizeBuffers,它可能应该这样做。 您可以在SetFullscreenState之后手动调用ResizeBuffers,这也应该可以工作

是的,MSDN有一篇关于DXGI实践的好文章,包括全屏转换:

第二部分你做了吗?“指定IDXGIOutput::GetDisplayModeList中不可用的DXGI_MODE_DESC”我个人建议改为在GameDev.Net上发布,因为那里的DirectX专业知识比这里多得多。你做了第二部分吗?“指定IDXGIOutput::GetDisplayModeList中不可用的DXGI_MODE_DESC”我个人建议将其发布在GameDev.Net上,因为那里有比这里多得多的DirectX专业知识。