在禁用DWM的窗口模式下Direct3D 10 vsync问题

时间:2012-11-12 11:11:16

标签: directx directx-10 dwm vsync direct3d10

我在禁用DWM的窗口模式下在Direct3D 10上遇到vsync问题。

我们有一个应用程序,它呈现并呈现一些输出。它必须在窗口模式下工作,它必须至少产生稳定的60 fps。 一个版本的应用程序使用Direct3D 9和另一个Direct3D 10.当我们在窗口模式下工作时,有时我们有fps减少(它不是“稳定”减少。在大多数时候我们产生稳定的60 fps,有时它会突然减少几秒钟,然后回到60帧/秒)。在两个版本的应用程序中,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 );

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

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

因此,在全屏模式下的Direct3D 10上一切正常。 Vsync工作得很好。在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像素。因此,在创建带标题栏的窗口时,图像的顶部有时可能无法看到图像撕裂。

0 个答案:

没有答案