2

我是 Direct3D9 的新手,正在尝试一些东西。我希望在“IDirect3DDevice9Ex”设备上使用“WaitForVSync”。但是,我不知道如何使用它并获得 VSYNC 中断。我在 MSDN 和任何代码片段上都找不到太多帮助。任何帮助,将不胜感激。

谢谢,莫茨

4

2 回答 2

1

此代码将允许您在垂直空白期间调用函数(进行中断)。由于时间问题,我不建议这样做。当您发现自己处于垂直空白期时,它可能已经结束。如果您知道您的目标硬件,您可以尝试考虑这一点,但您必须通过实验计算函数调用的延迟。我建议不要使用 VSYNC 回调。无论如何,这是执行此操作的代码。

D3DRASTER_STATUS rStatus;  
pd3dDevice->GetRasterStatus(0, &rStatus);

while (rStatus.InVBlank)
{
  Sleep(0); // Ensure other threads get CPU time.
  pd3dDevice->GetRasterStatus(0, &rStatus);
}

// Should be in a vertical blank period. Call your function here.
MyFunction();
于 2012-02-13T22:11:23.247 回答
0

1) 如果您想确保仅在发生垂直同步时显示您的显示,请使用 D3DPRESENT_INTERVAL_DEFAULT 或 D3DPRESENT_INTERVAL_ONE。

2) 如果你想在 Present() 等待 vsync 时做一些处理,你可以使用带有 IDirect3DSwapChain9::Present 的 D3DPRESENT_DONOTWAIT 标志,如果演示(和 vsync)还没有发生,这将返回 D3DERR_WASSTILLDRAWING。您可以调用 IDirect3DDevice9::GetSwapChain 来获取默认交换链。

3)也可以使用IDirect3DDevice9::GetRasterStatus来判断光栅(扫描线)是否在垂直同步区域。这确实需要驱动程序和硬件支持,您可以通过检查 D3DCAPS9.Caps 中的 D3DCAPS_READ_SCANLINE 来确定您的是否支持。我所知道的所有现代图形硬件都暴露了这个上限,但它也可能取决于所使用的显示器/电视的年龄/类型。

抄自:http ://www.gamedev.net/topic/319407-wait-for-vsync/

于 2011-10-14T12:02:51.213 回答