如何使用'WaitForVBlank'在Direct3d9中获取VSYNC中断

时间:2011-10-05 08:34:21

标签: direct3d directx-9 direct3d9

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

谢谢, MOTS

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

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

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

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

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