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

所以,我在窗口应用程序中使用D3D。 我用以下参数点了D3D:
windowed: true;
backbufferformat: D3DFMT_X8R8G8B8;
presentinterval: D3DPRESENT_INTERVAL_ONE;
swapeffect: DISCARD
每次调用OnPaint时,我都会将图像渲染到后备缓冲区并将其呈现在前面。 据我所知(MSDN也这么说),一旦我设置
D3DPRESENT_INTERVAL_ONE
,vsync就可以了。 但在这种情况下,水平拖动时图像会被撕掉。 (似乎图像上有一条线,显示屏上显示的线下方的图像以及上面的部分。) 有些网站称D3DPRESENT_INTERVAL_ONE不适用于窗口化应用程序。 我怎样才能启用vsync? 附:我终于发现D3D vsync已启用,而某些窗口设置不正确,可能是窗口本身未同步。不过,我没有偷看这些设置。     
已邀请:
我假设你正在使用D3D9?应该添加该标签。在你的
D3DPRESENT_PARAMS
变量上:
if (bVysncEnabled)
{
    presentParams.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
    presentParams.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
}
else
{
    presentParams.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
    presentParams.FullScreen_RefreshRateInHz = 0;
}
如果你已经完成了这个并且你正在使用旧的GDI东西,那么你的vsync设置不是错误的,而是窗口设置。你必须启用双缓冲,否则你仍然会撕裂。     
您无法在窗口中进行vsync,仅在全屏模式下进行。但是,您可以通过从默认显示中获取信息并查找刷新率,然后将渲染器缩小到仅以该速率渲染来潜在地解决它...尽管我不会建议该路线。     
窗口历史上无法为d3d提供vsynced,并且直到最近才有可能,当在WinVista或Win7中启用aero且应用程序未在演示模式下运行时。     
你多久打电话:: OnPaint?我问的原因是,你必须比连接的显示器的刷新率更频繁地调用:: OnPaint。 对我来说,只要消息循环空闲并使窗口无效,我就会通过强制:: OnPaint来解决刷新问题。如果你这样做会发生什么,是D3D的RenderPresent命令将等待,直到图形卡完成渲染,这给你一个非常精确的时间::OnPaint与实际的显示器刷新率同步! 我在这方面取得了很大的成功,并且窗口模式上面的语句不能vsync绝对不是真的。即使在DirectX 9 Win XP中,这也是有效的。 哦,最后但并非最不重要的是,如果您连接了多个显示器,请确保与显示窗口的实际显示屏进行vsync。这看起来有点棘手。     
不完全是D3D,但AntiTearing.html描述了MPC-HC如何使用窗口化的EVR等来尝试避免撕裂窗口显示。这里的链接:http://betterlogic.com/roger/2012/05/gdi-vsync-to-avoid-tearing/也可能对同步很有用(虽然有些解决方法)。     

要回复问题请先登录注册