2010-12-20 191 views

回答

0

发现这个同时寻找完全不同的东西...

从MSDN

... DXGI重新调整前缓冲区以匹配新选择的全屏幕en模式,并向应用程序发送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可以自动计算此值。 ...