首页 > 解决方案 > 在directx11代码中更改全屏模式下的刷新率不起作用

问题描述

我希望能够在代码中首次初始化后更改刷新率。我使用的是 DX11.0 据我所知,基本上有两种方法可以做到这一点。第一个是使用 IDXGIFactory::CreateSwapChain 以所需的刷新率重新创建交换链。第二种是使用 IDXGISwapChain::ResizeTarget。用所需的刷新率填写描述。

下面是我的第一种方法的代码:

DXGI_SWAP_CHAIN_DESC swapchain_desc;
ZeroMemory(&swapchain_desc,sizeof(swapchain_desc));
sSwapChain->GetDesc(&swapchain_desc);//get the description from the original swapchain

//release the backbuffer
sContext->ClearState();
sContext->Flush();

sBackBufferRenderTargetView.Release();
sBackBufferTexture.Release();

//release the current swapchain
sSwapChain.Release();

//create the new swapchain with my desired refreshrate
swapchain_desc.BufferDesc.Width = sDeviceMode.dmPelsWidth;//sDeviceMode is a device mode specified by user
swapchain_desc.BufferDesc.Height = sDeviceMode.dmPelsHeight;
swapchain_desc.BufferDesc.RefreshRate.Numerator= sDeviceMode.dmDisplayFrequency;
swapchain_desc.Windowed = false;

COMPtr<IDXGISwapChain> pSwapChain;
HRESULT hr = sDXGIFactory->CreateSwapChain(sD3D11Device,&swapchain_desc,&pSwapChain);
gAssert(SUCCEEDED(hr));
hr = pSwapChain->QueryInterface(&sSwapChain);
gAssert(SUCCEEDED(hr));

sSwapChain->SetFullscreenState(true,nullptr);

我应该提一下,从原始交换链描述中获得的其他设置是完全有效的。当我将分辨率 1280*800 和刷新率为 75HZ 传递给代码时,createswapchain 的返回结果是 S_OK,这意味着交换链创建成功,但是当我检查显示器硬件上显示的刷新率时,它没有改变,硬件显示分辨率为1920*1080,刷新率为60HZ。

然后我尝试了第二种方法,这是代码块:

DXGI_MODE_DESC mode_desc;
ZeroMemory(&mode_desc,sizeof(mode_desc));

mode_desc.Width = sDeviceMode.dmPelsWidth;
mode_desc.Width = sDeviceMode.dmPelsHeight;
mode_desc.RefreshRate.Numerator= sDeviceMode.dmDisplayFrequency;
mode_desc.RefreshRate.Denominator= 1;
mode_desc.Format = swapchain_desc.BufferDesc.Format;
mode_desc.Scaling= swapchain_desc.BufferDesc.Scaling;

hr = sSwapchain->ResizeTarget(&mode_desc);
gAssert(SUCCEEDED(hr));

sSwapChain->SetFullscreenState(true,nullptr);

sSwapchain->ResizeTarget 的返回结果也是 S_OK,但我想要的刷新率没有设置到显示器。

如果有人能指出我的错误,将不胜感激。

标签: c++directx-11

解决方案


文档说您必须DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH在字段中设置标志DXGI_SWAP_CHAIN_DESC::Flags才能切换视频模式。


推荐阅读