如何在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已启用,但某些窗口设置不正确,可能窗口本身未同步。尽管如此,我还没有看清楚设置。
回答:
你不能在窗口中同步,只能在全屏模式下。但是,您可能会通过从默认显示获取信息并找到刷新率,然后削弱您的渲染器以仅渲染该速率来疏忽它,尽管我不会建议该路线。
回答:
对于d3d而言,历史上的窗口已经无法被验证,并且直到最近才有可能,当在WinVista或Win7中启用aero并且该应用程序未在演示模式下运行时。
回答:
不完全是D3D,但是AntiTearing.html描述了MPC-HC如何使用窗口化的EVR等尝试和避免撕开窗口显示器。这里的链接:http://betterlogic.com/roger/2012/05/gdi-vsync-to-avoid-tearing/也可能对同步很有用(尽管是一种解决方法)。
回答:
你多久打一次电话:: OnPaint?我问的原因是,您必须更多地调用:: OnPaint,而不是连接的显示器的刷新率。
对于我来说,只要消息循环处于空闲状态并使窗口无效,我就通过强制执行一个:: OnPaint来解决刷新问题。如果你这样做,会发生什么事情,即D3D的RenderPresent命令将等待,直到显卡完成渲染,这会给你一个非常精确的时间:: OnPaint与实际显示器刷新率同步!
我在这方面取得了很好的成功,并且上面那个窗口模式的语句不能vsync是绝对不正确的。即使在DirectX 9 Win XP中,这也行得通。
哦,最后但并非最不重要的一点,如果您连接了多个显示器,请确保与显示窗口的实际显示器同步。这似乎有点棘手。
回答:
我假设你使用的是D3D9?应该添加该标签。在您D3DPRESENT_PARAMS
变量:
如果你这样做,你正在使用的旧GDI的东西,这不是你的VSYNC设置这是错误的,但窗口的设置。你必须启用双缓冲,否则你仍然会撕裂。
以上是 如何在D3D窗口应用中启用VSYNC? 的全部内容, 来源链接: utcz.com/qa/261420.html