Directx 窗口模式下禁用DWM时Direct3D 10 vsync问题

Directx 窗口模式下禁用DWM时Direct3D 10 vsync问题,directx,directx-10,dwm,vsync,direct3d10,Directx,Directx 10,Dwm,Vsync,Direct3d10,在禁用DWM的窗口模式下,Direct3D 10上的vsync出现问题 我们有一个应用程序,它呈现并呈现一些输出。它必须在窗口模式下工作,并且必须至少产生稳定的60 fps。 一个版本的应用程序使用Direct3D 9,另一个版本使用Direct3D 10。当我们在窗口模式下工作时,有时会出现fps下降(不是“稳定”下降。在大多数情况下,我们会产生稳定的60 fps,有时会突然下降几秒钟,然后恢复到60 fps)。在两种版本的应用程序上,fps减少约10-20 fps。这是不能接受的 在Wind

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

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

在WindowsVista和Windows7中,有一种称为“桌面合成”的新图形系统,它改变了应用程序在屏幕上显示像素的方式。桌面合成由桌面窗口管理器(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赫兹的显示器

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

swapChainDesc.BufferDesc.RefreshRate.Numerator = 60;
swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
在演示时,我们设置了一个标志来打开vsync:

m_pSwapChain->Present( 1, 0 );
还有下一个vsync问题。有垂直线,从左到右快速移动。显示器的顶部有图像撕裂。

起初我们认为我们做错了什么。所以我安装了微软的示例“教程07:纹理映射和恒定缓冲区”和旋转立方体。使立方体更大,放置得更高,使其旋转更快,也会遇到同样的问题(见图)。



因此,在全屏模式下的Direct3D 10上,一切正常。Vsync工作得很好。在Direct3D 9上也可以,在禁用或启用DWM的情况下,vsync工作正常。在窗口模式下禁用DWM的Direct3D 10上存在问题。

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

那么,为什么会有这样的问题呢?如何解决这个问题,下一步该怎么做

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






UDP2。我还要注意,我正在创建带有标志WS\u POPUP的窗口,以隐藏标题栏(它必须隐藏)。图像撕裂出现在不同的地方。它总是在屏幕的顶部,但它可以是20像素,也可以是50像素。因此,在创建带有标题栏的窗口时,图像撕裂有时在图像的顶部是不可见的。

有人可以打开图片链接吗?我打不开。无法加载网页,因为服务器未发送任何数据。嗯,奇怪。编辑了一篇帖子并添加了一些镜像。我对DX11也有同样的问题,你找到解决方案了吗?@GuyGodin没有,但你可以在这里找到更多信息。如果我的无边界窗口接触到屏幕的两侧,我也有类似的问题(以~50px的速度移动)。给我留一个1px的边界奇怪地解决了这个问题