我是Direct3D9上的新手,正在尝试一些东西。我希望在'IDirect3DDevice9Ex‘设备上使用'WaitForVSync’。但是,我不知道如何使用它并获得VSYNC中断。我在MSDN上找不到太多帮助,也找不到任何代码片段。任何帮助都将不胜感激。
谢谢,Mots
发布于 2012-02-14 06:11:23
此代码将允许您在垂直空白期间调用函数(进行中断)。由于时间问题,我不建议这样做。当你意识到自己处于垂直空白期时,它可能已经结束了。如果你知道你的目标硬件,你可以试着解决这个问题,但是你必须通过实验来计算函数调用的延迟。我建议不要使用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();发布于 2011-10-14 20:02:51
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/
https://stackoverflow.com/questions/7658629
复制相似问题