我是Direct3D9的新手并尝试了一些东西。我希望在'IDirect3DDevice9Ex'设备上使用'WaitForVSync'。但是,我不知道如何使用它并获得VSYNC中断。 我在MSDN上找不到太多帮助,也没有任何代码片段。任何帮助将不胜感激。
谢谢, MOTS
答案 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来确定您的支持是否支持它。我所知道的所有现代图形硬件确实暴露了这个上限,但它也可能取决于所使用的监视器/电视的年龄/类型。