1

SteamVR/OpenVR を使用するネイティブ C++ アプリケーションがあります。一部のフレームでは、複数のスレッドを作成して作業を分散しています。これらのスレッドはすべて、続行する前に終了する必要があるため、すぐに join を呼び出します。

マルチスレッドの計算に 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 サンプル プロジェクトで問題を再現すると、数フレームごとに発生するように見えますが、それでも非常に頻繁に発生します。

ここに画像の説明を入力

もちろん、フレームごとにスレッドを再利用する場合はスレッドをプールする必要があることは承知していますが、いずれにせよ、単一の (またはいくつかの) スレッドを作成 (および結合) するのにそれほど時間がかからないはずです。そして、時間測定が示すように、16ms にさえ近づきません。では、なぜ OpenVR がこれほど長い間停止するのでしょうか?

4

0 に答える 0