1

我有一个使用 SteamVR/OpenVR 的本机 C++ 应用程序。在某些帧中,我正在创建多个线程来分配一些工作。所有这些线程必须在继续之前完成,所以我立即调用它们加入。

尽管多线程计算花费的时间不超过 1 毫秒,但帧时间(如 SteamVR 提供的帧同步窗口所示)仍然飙升至 16 毫秒以上(比例停止在 16 毫秒)。

只需在 OpenVR 示例项目hellovr_opengl中启动一个单独的空线程并在之后立即加入即可轻松复制该问题。在我的例子中,我在 MainApplication 的 RenderFrame() 函数中插入了这个代码片段,但其他任何地方都可以正常工作:

auto tempStart = std::chrono::high_resolution_clock::now();
std::thread t([]() {});
t.join();
auto tempEnd = std::chrono::high_resolution_clock::now();
std::cout << "Time: " << std::chrono::duration_cast<std::chrono::milliseconds>(tempEnd - tempStart).count() << std::endl;

在我自己的应用程序中,我每帧都获得了高帧时间。在 OpenVR 示例项目中重现该问题时,它似乎每隔几帧就会发生一次,但仍然非常频繁:

在此处输入图像描述

我当然知道,如果我每帧重用线程,我可能应该池化线程,但无论如何,创建(和加入)单个(甚至几个)线程不应该花那么长时间。正如时间测量所示,它甚至没有接近 16 毫秒。那么为什么 OpenVR 会停滞这么长时间呢?

4

0 回答 0