5

在禁用 DWM 的窗口模式下,Direct3D 10 上的 vsync 出现问题。

我们有一个应用程序,它呈现并呈现一些输出。它必须在窗口模式下工作,并且必须至少产生稳定的 60 fps。一个版本的应用程序使用 Direct3D 9 和另一个 Direct3D 10。当我们在窗口模式下工作时,有时我们会降低 fps(它不是​​“稳定”降低。在大多数情况下,我们产生稳定的 60 fps,有时它会突然降低几秒钟,然后恢复到 60 fps)。在这两个版本的应用程序中,fps 降低约为 10-20 fps。这是不可接受的。

在 Windows Vista 和 Windows 7 中,有新的图形系统,称为“桌面合成”,它改变了应用程序在屏幕上显示像素的方式。桌面合成由桌面窗口管理器 (DWM) 执行。您知道,当启用 DWM 时,应用程序会绘制到显存中的屏幕外表面,而不是由 DWM 渲染并在一段时间内呈现在显示器上。因此,我们注意到,当任务管理器中的 dwm.exe 不执行任何操作(处理时间约为 0%)时,我们的 fps 会降低,而当 dwm.exe 占用 1-3% 的处理时间时,会有稳定的 60 fps 并且一切正常好的。

我们无法影响它。因此,我们必须关闭 DWM 才能获得高稳定的 fps。当我们关闭它时,一切正常。两个版本的应用程序都有稳定的 60 fps。但是DWM是在窗口模式下做vsync的,所以当我们关闭它的时候,我们必须自己做vsync。

但是当我们关闭 DWM 时,Direct3D 10 在窗口模式下的 vsync 会出现问题。显示器顶部有图像撕裂。Direc3D 9 一直运行良好。

因此,我们有一台刷新率为 60 Hz 的显示器。

在创建交换链时,我们设置了这样的参数:

swapChainDesc.BufferDesc.RefreshRate.Numerator = 60;
swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;

在演示时,我们设置了一个标志来打开 vsync:

m_pSwapChain->Present( 1, 0 );

并有下一个垂直同步问题。有垂直线,从左侧快速移动到右侧。并且显示器顶部有图像撕裂。
http://bit.ly/POQoFq

起初我们认为,我们做错了什么。所以我用旋转立方体安装了微软的示例“Tutorial 07: Texture Mapping and Constant Buffers”。使立方体更大,将其放置得更高,使其旋转更快并遇到相同的问题(见图)。
http://bit.ly/SevNqw
http://bit.ly/RSoEhc
http://bit.ly/UjaNPu

因此,在全屏模式下的 Direct3D 10 上一切正常。垂直同步完美运行。在 Direct3D 9 上也一切正常,在禁用或启用 DWM 的情况下,vsync 效果很好。在禁用 DWM 的窗口模式下的 Direct3D 10 上存在问题。

它在不同的计算机、不同的显卡(Nvidia 8600 GT、Nvidia 9500 GT、ATI Radeon HD 5870 Eyefinity 6)和不同版本的驱动程序上进行了测试。问题稳定重现。我们使用的是 Windows 7。

那么,为什么会出现这样的问题呢?如何解决它以及下一步该怎么做?

UPD1。如果上面的图像不可用,则有一些镜子。

https://dl.dropbox.com/u/20468014/DSC_2287.JPG
https://dl.dropbox.com/u/20468014/DSC_2308.JPG
https://dl.dropbox.com/u/20468014/DSC_2313。 JPG
https://dl.dropbox.com/u/20468014/DSC_2319.JPG

UDP2。我还想注意,我正在创建带有标志 WS_POPUP 的窗口以隐藏标题栏(它必须被隐藏)。图像撕裂出现在不同的地方。它总是在屏幕的顶部,但它可以是 20 像素,也可以是 50 像素。因此,在创建带有标题栏的窗口时,有时图像的顶部可能根本看不到图像撕裂。

4

0 回答 0