如何在等待垂直同步时执行操作?

时间:2011-06-23 06:45:12

标签: direct3d python-idle vertical-sync

我希望能够加载/下载一堆资源并通知用户当前正在加载的文件,但我不能在每个文件开始加载后绘制一个帧,因为v-sync将等到它可以在框架继续之前绘制框架(将负载瓶颈缩小到小于60 /秒)。

有没有办法检查设备是否准备好绘制(没有hacky“已经过了1/60秒?),所以我可以执行操作直到它准备好了吗?我不介意是否通知会跳过在准备好绘制之前已完成的文件,但我希望最大化加载速度,同时仍能够通知用户。

另外,我想避免暂时禁用v-sync,因为如果计算机加载速度非常快,我不想让显卡损失300FPS。

1 个答案:

答案 0 :(得分:1)

您没有指定您正在使用的Direct3D版本。使用D3D9,您可以将D3DPRESENT_DONOTWAIT传递给Present()调用,如果硬件正忙于处理或等待垂直同步间隔,它将返回D3DERR_WASSTILLDRAWING。这意味着如果您启用了vsync,则在主循环中,只要您加载文件,就可以使用DONOTWAIT标志调用Present,如果它返回WASSTILLDRAWING则加载另一个文件。

请注意,您需要获取交换链并在交换链上调用Present()而不是直接在设备上调用Present()以便能够传递此标志,或者您可以在D3DPRESENT_PARAMETERS结构中设置它当您创建设备或创建IDirect3DDevice9Ex而不是IDirect3DDevice9设备并调用PresentEx()而不是Present()。

这并不能解决加载时间超过帧的文件的问题 - 如果您的文件需要很长时间才能处理,那么帧速率将会下降。在我看来,更好的解决这个问题的方法是将尽可能多的IO移动到另一个线程(在D3D9中,你仍然需要在主线程上创建D3D资源)并且只传递当前文件的名称处理到主/渲染线程,以便在每次呈现帧时显示。