0

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

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

此外,我想避免暂时禁用垂直同步,因为如果计算机加载速度非常快,我不想导致显卡严重降低 300FPS 速率。

4

1 回答 1

1

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

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

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

于 2011-06-23T18:16:24.260 回答