答案 0 :(得分:0)
在寻找完全不同的东西时找到了这个......
来自MSDN
... DXGI调整前缓冲区的大小以匹配新选择的全屏模式,并向应用程序发送WM_SIZE消息。应用程序再次调用ResizeBuffers,就像拖动窗口边框一样。
前面解释的方法遵循一条非常特殊的路径。 DXGI默认将全屏分辨率设置为桌面分辨率。然而,许多应用程序切换到首选的全屏分辨率。在这种情况下,DXGI提供IDXGISwapChain :: ResizeTarget。这应该在调用SetFullscreenState之前调用。虽然可以以相反的顺序调用这些方法(首先是SetFullscreenState,然后是ResizeTarget),但这样做会导致将额外的WM_SIZE消息发送到应用程序。 (这样做也会导致闪烁,因为DXGI可能被强制执行两种模式更改。)调用SetFullscreenState后,建议再次调用ResizeTarget,并将RefreshRate成员清零。这相当于DXGI中的无操作指令,但它可以避免刷新率的问题,这将在下面讨论。
在全屏模式下,桌面窗口管理器被禁用。 DXGI可以执行翻转以呈现后台缓冲区内容而不是执行blit,这将在窗口模式下执行。但是,如果不满足某些要求,则可以撤消该性能增益。为确保DXGI执行翻转而不是blit,前缓冲区和后缓冲区的大小必须相同。如果应用程序正确处理其WM_SIZE消息,这应该不是问题。此外,格式必须相同。
大多数应用程序的问题是刷新率。在调用ResizeTarget时指定的刷新率必须是由交换链正在使用的IDXGIOutput对象枚举的刷新率。如果应用程序将传递给ResizeTarget的DXGI_MODE_DESC的RefreshRate成员清零,则DXGI可以自动计算此值。 ...