首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Direct3d9中使用'WaitForVBlank‘获取垂直同步中断

如何在Direct3d9中使用'WaitForVBlank‘获取垂直同步中断
EN

Stack Overflow用户
提问于 2011-10-05 16:34:21
回答 2查看 4.5K关注 0票数 2

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

谢谢,Mots

EN

回答 2

Stack Overflow用户

发布于 2012-02-14 06:11:23

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 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/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7658629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档