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

St.*_* KG 5 directx direct3d vsync direct3d9

因此,我在窗口应用程序中使用 D3D。

我使用以下参数启动了 D3D:

windowed: true;
backbufferformat: D3DFMT_X8R8G8B8;
presentinterval: D3DPRESENT_INTERVAL_ONE;
swapeffect: DISCARD
Run Code Online (Sandbox Code Playgroud)

每次调用 OnPaint 时,我都会将图像渲染到后缓冲区并将其呈现到前面。

据我所知(MSDN也是这么说的),一旦我设置了D3DPRESENT_INTERVAL_ONE,vsync就会起作用。

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

(图像上似乎有一条线,线下方的图像显示在监视器上,上面的部分如下。)

一些网站说 D3DPRESENT_INTERVAL_ONE 在窗口应用程序中不起作用。

我怎样才能启用垂直同步?

ps我终于发现D3D垂直同步是启用的,而有些窗口设置不正确,也许窗口本身没有同步。不过,我还没有看过设置。

orf*_*orf 6

我猜你用的是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;
}
Run Code Online (Sandbox Code Playgroud)

如果您已完成此操作并且正在使用旧的 GDI 内容,那么问题不是您的垂直同步设置,而是窗口设置。您必须启用双缓冲,否则仍然会出现撕裂现象。


sri*_*ger 1

在窗口模式下无法垂直同步,只能在全屏模式下垂直同步。但是,您可能会通过从默认显示器获取信息并找到刷新率,然后削弱您的渲染器以仅以该速率渲染来限制它......尽管我不建议这样做。