2011-06-23 113 views
0

我希望能够加载/下载一堆资源并通知用户当前正在加载的文件,但是我不能在每个文件开始加载后画一个框架,因为v-sync会一直等到它可以在它继续之前绘制一个框架(将瓶颈颈缩到小于60 /秒)。如何在等待垂直同步时执行操作?

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

另外,我想避免即使暂时禁用v-sync因为我不想导致图形卡在300FPS速率下如果电脑真的很快加载速度太慢

回答

1

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

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

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