如何在D3D窗口应用中启用VSYNC?

问题描述:

所以,我在窗口应用程序中使用D3D。如何在D3D窗口应用中启用VSYNC?

我inited D3D使用以下参数:

windowed: true; 
backbufferformat: D3DFMT_X8R8G8B8; 
presentinterval: D3DPRESENT_INTERVAL_ONE; 
swapeffect: DISCARD 

每次OnPaint中被调用时,我呈现图像后备缓冲区并将其呈现给前面。

据我所知(MSDN也这样说),一旦我设置了D3DPRESENT_INTERVAL_ONE,vsync就可以工作。

但是在这种情况下,水平拖动时图像被撕裂。

(似乎有在图像的线,该线下方的图像显示在监视器上和上述部分如下)。

有些网站说D3DPRESENT_INTERVAL_ONE不会在窗口的应用程序。

我该如何启用vsync?

p.s.我终于发现D3D vsync已启用,但某些窗口设置不正确,可能窗口本身未同步。尽管如此,我还没有看清楚设置。

+0

你有没有试过swapeffect:FLIP? – Goz 2010-10-13 08:02:07

+0

我试着按照你的建议,但它没有工作.. – 2010-10-13 09:15:01

+0

TBH我的理解总是说你不能VSync窗口渲染器。也许我错了,但有了这个假设,我从来没有失望;) – Goz 2010-10-17 19:11:26

你不能在窗口中同步,只能在全屏模式下。但是,您可能会通过从默认显示获取信息并找到刷新率,然后削弱您的渲染器以仅渲染该速率来疏忽它,尽管我不会建议该路线。

对于d3d而言,历史上的窗口已经无法被验证,并且直到最近才有可能,当在WinVista或Win7中启用aero并且该应用程序未在演示模式下运行时。

不完全是D3D,但是AntiTearing.html描述了MPC-HC如何使用窗口化的EVR等尝试和避免撕开窗口显示器。这里的链接:http://betterlogic.com/roger/2012/05/gdi-vsync-to-avoid-tearing/也可能对同步很有用(尽管是一种解决方法)。

+0

MPC-HC的链接被破坏,这是最后一个存档:https://web.archive.org/web/20120505154244/http://mpc-hc.sourceforge.net/AntiTearing.html 顺便说一句,我没有看到有任何描述提到。 – tsul 2017-01-31 16:38:09

你多久打一次电话:: OnPaint?我问的原因是,您必须更多地调用:: OnPaint,而不是连接的显示器的刷新率。

对于我来说,只要消息循环处于空闲状态并使窗口无效,我就通过强制执行一个:: OnPaint来解决刷新问题。如果你这样做,会发生什么事情,即D3D的RenderPresent命令将等待,直到显卡完成渲染,这会给你一个非常精确的时间:: OnPaint与实际显示器刷新率同步!

我在这方面取得了很好的成功,并且上面那个窗口模式的语句不能vsync是绝对不正确的。即使在DirectX 9 Win XP中,这也行得通。

哦,最后但并非最不重要的一点,如果您连接了多个显示器,请确保与显示窗口的实际显示器同步。这似乎有点棘手。

我假设你使用的是D3D9?应该添加该标签。在您D3DPRESENT_PARAMS变量:

如果你这样做,你正在使用的旧GDI的东西,这不是你的VSYNC设置这是错误的,但窗口的设置。你必须启用双缓冲,否则你仍然会撕裂。