c++ - 在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,但我想要的刷新率没有设置到显示器。
如果有人能指出我的错误,将不胜感激。
解决方案
文档说您必须DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH
在字段中设置标志DXGI_SWAP_CHAIN_DESC::Flags
才能切换视频模式。
推荐阅读
- python - Python 和 Selenium 移动仿真
- python - 如何在相对简单的 Python 程序中设置 AxesSubplot 的大小?
- java - 如何在 Java 中将数字转换为字母?
- python - 从与另一个列表没有共同元素的总体中生成随机样本列表
- html - 带有网格显示的日历 - 将网格单元底部的笔记/任务垂直对齐
- javascript - 如果死了,如何在php中添加html链接
- python-3.x - 比较包含字典列表值的字典
- r - 如何在同一个 ggplot2 图上绘制 CSV 文件和数学函数?
- azure-devops - 使用 Azure DevOps 管道的 AzureFileCopy 失败 - 'AzCopy.exe 以非零退出方式退出
- python - 如何在所有小部件调整大小操作后对任务进行排队?