Profile window manager update

This commit is contained in:
elsid 2022-10-06 01:56:47 +02:00
parent 212c7c7f25
commit 2f5adbb083
No known key found for this signature in database
GPG key ID: 4DE04C198CBA7625
3 changed files with 54 additions and 42 deletions

View file

@ -170,8 +170,6 @@ void OMW::Engine::executeLocalScripts()
} }
bool OMW::Engine::frame(float frametime) bool OMW::Engine::frame(float frametime)
{
try
{ {
const osg::Timer_t frameStart = mViewer->getStartTick(); const osg::Timer_t frameStart = mViewer->getStartTick();
const unsigned int frameNumber = mViewer->getFrameStamp()->getFrameNumber(); const unsigned int frameNumber = mViewer->getFrameStamp()->getFrameNumber();
@ -180,6 +178,8 @@ bool OMW::Engine::frame(float frametime)
mEnvironment.setFrameDuration(frametime); mEnvironment.setFrameDuration(frametime);
try
{
// update input // update input
{ {
ScopedProfile<UserStatsType::Input> profile(frameStart, frameNumber, *timer, *stats); ScopedProfile<UserStatsType::Input> profile(frameStart, frameNumber, *timer, *stats);
@ -294,6 +294,11 @@ bool OMW::Engine::frame(float frametime)
ScopedProfile<UserStatsType::Gui> profile(frameStart, frameNumber, *timer, *stats); ScopedProfile<UserStatsType::Gui> profile(frameStart, frameNumber, *timer, *stats);
mWindowManager->update(frametime); mWindowManager->update(frametime);
} }
}
catch (const std::exception& e)
{
Log(Debug::Error) << "Error in frame: " << e.what();
}
const bool reportResource = stats->collectStats("resource"); const bool reportResource = stats->collectStats("resource");
@ -315,11 +320,21 @@ bool OMW::Engine::frame(float frametime)
mWorld->reportStats(frameNumber, *stats); mWorld->reportStats(frameNumber, *stats);
mLuaManager->reportStats(frameNumber, *stats); mLuaManager->reportStats(frameNumber, *stats);
} }
}
catch (const std::exception& e) mViewer->eventTraversal();
mViewer->updateTraversal();
{ {
Log(Debug::Error) << "Error in frame: " << e.what(); ScopedProfile<UserStatsType::WindowManager> 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; return true;
} }
@ -374,6 +389,7 @@ OMW::Engine::~Engine()
mSoundManager = nullptr; mSoundManager = nullptr;
mInputManager = nullptr; mInputManager = nullptr;
mStateManager = nullptr; mStateManager = nullptr;
mLuaWorker = nullptr;
mLuaManager = nullptr; mLuaManager = nullptr;
mScriptContext = nullptr; mScriptContext = nullptr;
@ -669,6 +685,9 @@ void OMW::Engine::prepareEngine()
mLuaManager = std::make_unique<MWLua::LuaManager>(mVFS.get(), mResDir / "lua_libs"); mLuaManager = std::make_unique<MWLua::LuaManager>(mVFS.get(), mResDir / "lua_libs");
mEnvironment.setLuaManager(*mLuaManager); mEnvironment.setLuaManager(*mLuaManager);
// starts a separate lua thread if "lua num threads" > 0
mLuaWorker = std::make_unique<MWLua::Worker>(*mLuaManager, *mViewer);
// Create input and UI first to set up a bootstrapping environment for // Create input and UI first to set up a bootstrapping environment for
// showing a loading screen and keeping the window responsive while doing so // showing a loading screen and keeping the window responsive while doing so
@ -886,8 +905,6 @@ void OMW::Engine::go()
mWindowManager->executeInConsole(mStartupScript); mWindowManager->executeInConsole(mStartupScript);
} }
MWLua::Worker luaWorker(*mLuaManager, *mViewer); // starts a separate lua thread if "lua num threads" > 0
// Start the main rendering loop // Start the main rendering loop
double simulationTime = 0.0; double simulationTime = 0.0;
Misc::FrameRateLimiter frameRateLimiter = Misc::makeFrameRateLimiter(mEnvironment.getFrameRateLimit()); Misc::FrameRateLimiter frameRateLimiter = Misc::makeFrameRateLimiter(mEnvironment.getFrameRateLimit());
@ -908,17 +925,6 @@ void OMW::Engine::go()
} }
else 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(); bool guiActive = mWindowManager->isGuiMode();
if (!guiActive) if (!guiActive)
simulationTime += dt; simulationTime += dt;
@ -940,7 +946,7 @@ void OMW::Engine::go()
frameRateLimiter.limit(); frameRateLimiter.limit();
} }
luaWorker.join(); mLuaWorker->join();
// Save user settings // Save user settings
Settings::Manager::saveUser(mCfgMgr.getUserConfigPath() / "settings.cfg"); Settings::Manager::saveUser(mCfgMgr.getUserConfigPath() / "settings.cfg");

View file

@ -38,6 +38,7 @@ namespace Compiler
namespace MWLua namespace MWLua
{ {
class LuaManager; class LuaManager;
class Worker;
} }
namespace Stereo namespace Stereo
@ -132,6 +133,7 @@ namespace OMW
std::unique_ptr<MWInput::InputManager> mInputManager; std::unique_ptr<MWInput::InputManager> mInputManager;
std::unique_ptr<MWState::StateManager> mStateManager; std::unique_ptr<MWState::StateManager> mStateManager;
std::unique_ptr<MWLua::LuaManager> mLuaManager; std::unique_ptr<MWLua::LuaManager> mLuaManager;
std::unique_ptr<MWLua::Worker> mLuaWorker;
MWBase::Environment mEnvironment; MWBase::Environment mEnvironment;
ToUTF8::FromType mEncoding; ToUTF8::FromType mEncoding;
std::unique_ptr<ToUTF8::Utf8Encoder> mEncoder; std::unique_ptr<ToUTF8::Utf8Encoder> mEncoder;

View file

@ -38,6 +38,7 @@ namespace OMW
Gui, Gui,
Lua, Lua,
LuaSyncUpdate, LuaSyncUpdate,
WindowManager,
Number, Number,
}; };
@ -80,6 +81,9 @@ namespace OMW
template <> template <>
inline const UserStats UserStatsValue<UserStatsType::LuaSyncUpdate>::sValue{ " -Sync", "luasyncupdate" }; inline const UserStats UserStatsValue<UserStatsType::LuaSyncUpdate>::sValue{ " -Sync", "luasyncupdate" };
template <>
inline const UserStats UserStatsValue<UserStatsType::WindowManager>::sValue{ "WindowManager", "windowmanager" };
template <UserStatsType type> template <UserStatsType type>
struct ForEachUserStatsValue struct ForEachUserStatsValue
{ {