diff --git a/apps/openmw/mwvr/openxrmanager.cpp b/apps/openmw/mwvr/openxrmanager.cpp index 6f217d0d8..4d56cf77c 100644 --- a/apps/openmw/mwvr/openxrmanager.cpp +++ b/apps/openmw/mwvr/openxrmanager.cpp @@ -31,26 +31,24 @@ namespace MWVR static void statsThreadRun() { - while (statsThreadRunning) - { - std::stringstream ss; - for (auto& context : stats) - { - for (auto& measurement : *context.second) - { - double ms = static_cast(measurement.second) / 1000000.; - Log(Debug::Verbose) << context.first << "." << measurement.first << ": " << ms << "ms"; - } - } + //while (statsThreadRunning) + //{ + // std::stringstream ss; + // for (auto& context : stats) + // { + // for (auto& measurement : *context.second) + // { + // double ms = static_cast(measurement.second) / 1000000.; + // Log(Debug::Verbose) << context.first << "." << measurement.first << ": " << ms << "ms"; + // } + // } - //Log(Debug::Verbose) << ss.str(); + // Log(Debug::Verbose) << ss.str(); - std::this_thread::sleep_for(std::chrono::seconds(1)); - } + // std::this_thread::sleep_for(std::chrono::seconds(1)); + //} } - - Timer::Timer(const char* name) : mName(name) { mLastCheckpoint = mBegin = std::chrono::steady_clock::now(); @@ -69,11 +67,11 @@ namespace MWVR stats.emplace_back(MeasurementContext(mName, mContext)); } - if (!statsThreadRunning) - { - statsThreadRunning = true; - statsThread = std::thread([] { statsThreadRun(); }); - } + //if (!statsThreadRunning) + //{ + // statsThreadRunning = true; + // statsThread = std::thread([] { statsThreadRun(); }); + //} } Timer::~Timer() { diff --git a/apps/openmw/mwvr/vrsession.cpp b/apps/openmw/mwvr/vrsession.cpp index 7d31af1cb..996b96450 100644 --- a/apps/openmw/mwvr/vrsession.cpp +++ b/apps/openmw/mwvr/vrsession.cpp @@ -145,19 +145,18 @@ void VRSession::startFrame() // we make our own (bad) prediction and let openxr wait auto frameState = xr->impl().frameState(); long long predictedDisplayTime = 0; - if (mFrames == mLastRenderedFrame) + mFrames++; + if (mLastPredictedDisplayTime == 0) { - predictedDisplayTime = frameState.predictedDisplayTime; + // First time, need to invent a frame time since openxr won't help us without calling waitframe. + predictedDisplayTime = std::chrono::duration_cast(std::chrono::steady_clock::now().time_since_epoch()).count(); } else if (mFrames > mLastRenderedFrame) { - predictedDisplayTime = frameState.predictedDisplayTime + mLastFrameInterval.count() * (mFrames - mLastRenderedFrame); - } - - if (mFrames == 0 || predictedDisplayTime == 0) - { - // First time, need to populate the frame state struct - predictedDisplayTime = std::chrono::duration_cast(std::chrono::steady_clock::now().time_since_epoch()).count(); + //predictedDisplayTime = mLastPredictedDisplayTime + mLastFrameInterval.count() * (mFrames - mLastRenderedFrame); + float intervalsf = static_cast(mLastFrameInterval.count()) / static_cast(frameState.predictedDisplayPeriod); + int intervals = (int)std::roundf(intervalsf); + predictedDisplayTime = mLastPredictedDisplayTime + intervals * (mFrames - mLastRenderedFrame) * frameState.predictedDisplayPeriod; } PoseSet predictedPoses{}; @@ -182,7 +181,6 @@ void VRSession::startFrame() predictedPoses = mPostdrawFrame->mPredictedPoses; } - mFrames++; mPredrawFrame.reset(new VRFrame); mPredrawFrame->mPredictedDisplayTime = predictedDisplayTime; diff --git a/apps/openmw/mwvr/vrsession.hpp b/apps/openmw/mwvr/vrsession.hpp index ceb769482..a0446a988 100644 --- a/apps/openmw/mwvr/vrsession.hpp +++ b/apps/openmw/mwvr/vrsession.hpp @@ -72,7 +72,8 @@ public: long long mFrames{ 0 }; long long mLastRenderedFrame{ 0 }; - + long long mLastPredictedDisplayTime{ 0 }; + long long mLastPredictedDisplayPeriod{ 0 }; std::chrono::nanoseconds mLastFrameInterval{}; std::chrono::steady_clock::time_point mLastRenderedFrameTimestamp{std::chrono::steady_clock::now()};