diff --git a/apps/openmw/engine.cpp b/apps/openmw/engine.cpp index 05eb457301..185acaf179 100644 --- a/apps/openmw/engine.cpp +++ b/apps/openmw/engine.cpp @@ -171,15 +171,15 @@ void OMW::Engine::executeLocalScripts() bool OMW::Engine::frame(float frametime) { + const osg::Timer_t frameStart = mViewer->getStartTick(); + const unsigned int frameNumber = mViewer->getFrameStamp()->getFrameNumber(); + const osg::Timer* const timer = osg::Timer::instance(); + osg::Stats* const stats = mViewer->getViewerStats(); + + mEnvironment.setFrameDuration(frametime); + try { - const osg::Timer_t frameStart = mViewer->getStartTick(); - const unsigned int frameNumber = mViewer->getFrameStamp()->getFrameNumber(); - const osg::Timer* const timer = osg::Timer::instance(); - osg::Stats* const stats = mViewer->getViewerStats(); - - mEnvironment.setFrameDuration(frametime); - // update input { ScopedProfile profile(frameStart, frameNumber, *timer, *stats); @@ -294,32 +294,47 @@ bool OMW::Engine::frame(float frametime) ScopedProfile profile(frameStart, frameNumber, *timer, *stats); mWindowManager->update(frametime); } - - const bool reportResource = stats->collectStats("resource"); - - if (reportResource) - stats->setAttribute(frameNumber, "UnrefQueue", mUnrefQueue->getSize()); - - mUnrefQueue->flush(*mWorkQueue); - - if (reportResource) - { - stats->setAttribute(frameNumber, "FrameNumber", frameNumber); - - mResourceSystem->reportStats(frameNumber, stats); - - stats->setAttribute(frameNumber, "WorkQueue", mWorkQueue->getNumItems()); - stats->setAttribute(frameNumber, "WorkThread", mWorkQueue->getNumActiveThreads()); - - mMechanicsManager->reportStats(frameNumber, *stats); - mWorld->reportStats(frameNumber, *stats); - mLuaManager->reportStats(frameNumber, *stats); - } } catch (const std::exception& e) { Log(Debug::Error) << "Error in frame: " << e.what(); } + + const bool reportResource = stats->collectStats("resource"); + + if (reportResource) + stats->setAttribute(frameNumber, "UnrefQueue", mUnrefQueue->getSize()); + + mUnrefQueue->flush(*mWorkQueue); + + if (reportResource) + { + stats->setAttribute(frameNumber, "FrameNumber", frameNumber); + + mResourceSystem->reportStats(frameNumber, stats); + + stats->setAttribute(frameNumber, "WorkQueue", mWorkQueue->getNumItems()); + stats->setAttribute(frameNumber, "WorkThread", mWorkQueue->getNumActiveThreads()); + + mMechanicsManager->reportStats(frameNumber, *stats); + mWorld->reportStats(frameNumber, *stats); + mLuaManager->reportStats(frameNumber, *stats); + } + + mViewer->eventTraversal(); + mViewer->updateTraversal(); + + { + ScopedProfile profile(frameStart, frameNumber, *timer, *stats); + mWorld->updateWindowManager(); + } + + mLuaWorker->allowUpdate(); // if there is a separate Lua thread, it starts the update now + + mViewer->renderingTraversals(); + + mLuaWorker->finishUpdate(); + return true; } @@ -374,6 +389,7 @@ OMW::Engine::~Engine() mSoundManager = nullptr; mInputManager = nullptr; mStateManager = nullptr; + mLuaWorker = nullptr; mLuaManager = nullptr; mScriptContext = nullptr; @@ -669,6 +685,9 @@ void OMW::Engine::prepareEngine() mLuaManager = std::make_unique(mVFS.get(), mResDir / "lua_libs"); mEnvironment.setLuaManager(*mLuaManager); + // starts a separate lua thread if "lua num threads" > 0 + mLuaWorker = std::make_unique(*mLuaManager, *mViewer); + // Create input and UI first to set up a bootstrapping environment for // showing a loading screen and keeping the window responsive while doing so @@ -886,8 +905,6 @@ void OMW::Engine::go() mWindowManager->executeInConsole(mStartupScript); } - MWLua::Worker luaWorker(*mLuaManager, *mViewer); // starts a separate lua thread if "lua num threads" > 0 - // Start the main rendering loop double simulationTime = 0.0; Misc::FrameRateLimiter frameRateLimiter = Misc::makeFrameRateLimiter(mEnvironment.getFrameRateLimit()); @@ -908,17 +925,6 @@ void OMW::Engine::go() } else { - mViewer->eventTraversal(); - mViewer->updateTraversal(); - - mWorld->updateWindowManager(); - - luaWorker.allowUpdate(); // if there is a separate Lua thread, it starts the update now - - mViewer->renderingTraversals(); - - luaWorker.finishUpdate(); - bool guiActive = mWindowManager->isGuiMode(); if (!guiActive) simulationTime += dt; @@ -940,7 +946,7 @@ void OMW::Engine::go() frameRateLimiter.limit(); } - luaWorker.join(); + mLuaWorker->join(); // Save user settings Settings::Manager::saveUser(mCfgMgr.getUserConfigPath() / "settings.cfg"); diff --git a/apps/openmw/engine.hpp b/apps/openmw/engine.hpp index 61d28402c2..021dccdf34 100644 --- a/apps/openmw/engine.hpp +++ b/apps/openmw/engine.hpp @@ -38,6 +38,7 @@ namespace Compiler namespace MWLua { class LuaManager; + class Worker; } namespace Stereo @@ -132,6 +133,7 @@ namespace OMW std::unique_ptr mInputManager; std::unique_ptr mStateManager; std::unique_ptr mLuaManager; + std::unique_ptr mLuaWorker; MWBase::Environment mEnvironment; ToUTF8::FromType mEncoding; std::unique_ptr mEncoder; diff --git a/apps/openmw/profile.hpp b/apps/openmw/profile.hpp index d13f09bbc7..526dfa2f00 100644 --- a/apps/openmw/profile.hpp +++ b/apps/openmw/profile.hpp @@ -38,6 +38,7 @@ namespace OMW Gui, Lua, LuaSyncUpdate, + WindowManager, Number, }; @@ -80,6 +81,9 @@ namespace OMW template <> inline const UserStats UserStatsValue::sValue{ " -Sync", "luasyncupdate" }; + template <> + inline const UserStats UserStatsValue::sValue{ "WindowManager", "windowmanager" }; + template struct ForEachUserStatsValue {