全屏独家:如何更改原始分辨率?

Fullscreen Exclusive: How to change the native resolution?

我可以通过在传递给 CreateSwapChainForHwndDXGI_SWAP_CHAIN_FULLSCREEN_DESC 中指定刷新率来成功控制本机刷新率。

我原以为本机分辨率会更改为由交换链的高度和宽度指定的分辨率。然而,我就没这么幸运了。

此外,CreateSwapChainForHwnd 建议您无法控制显示器的原始分辨率,因为您可以指定 DXGI_SWAP_CHAIN_FULLSCREEN_DESC 具有缩放参数

typedef enum DXGI_MODE_SCALING { 
  DXGI_MODE_SCALING_UNSPECIFIED  = 0,
  DXGI_MODE_SCALING_CENTERED     = 1,
  DXGI_MODE_SCALING_STRETCHED    = 2
} DXGI_MODE_SCALING;

但是,视频游戏在全屏独占模式下更改分辨率时显然会触发模式更改(临时黑屏)。所以他们必须能够改变原始分辨率。他们是怎么做到的?

另外,我想知道为什么 DXGI_MODE_SCALING_STRETCHED 只填充屏幕的一个子矩形(DXGI_MODE_SCALING_CENTERED 以这个子矩形为中心,并且 DXGI_MODE_SCALING_UNSPECIFIED 将交换链的右上角与这个子矩形的右上角)。这个子矩形也会随着传递给 CreateSwapChainForHwnd 的高度和宽度的变化而变化。也许是因为我真的在全屏优化而不是全屏独占 并且这个子矩形与我的 window 大小相同(更改 window 大小没有'影响观察到的行为)。

DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH Set this flag to enable an application to switch modes by calling IDXGISwapChain::ResizeTarget. When switching from windowed to full-screen mode, the display mode (or monitor resolution) will be changed to match the dimensions of the application window.

https://docs.microsoft.com/en-us/windows/win32/api/dxgi/ne-dxgi-dxgi_swap_chain_flag

有趣的是,模式开关在更改刷新率时可以在没有标志的情况下正常工作,但在更改分辨率时不会