From ab0841cc3ddcd971438283358211c42d30bc1c3e Mon Sep 17 00:00:00 2001 From: Andrei Kortunov Date: Mon, 7 Jan 2019 14:27:31 +0400 Subject: [PATCH] Split physics update from world update in the profiler --- apps/openmw/engine.cpp | 23 +++++++++++++++++++---- apps/openmw/mwbase/world.hpp | 1 + apps/openmw/mwworld/worldimp.cpp | 9 ++++++++- apps/openmw/mwworld/worldimp.hpp | 1 + 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/apps/openmw/engine.cpp b/apps/openmw/engine.cpp index f5b4171d4f..15a8f0f32b 100644 --- a/apps/openmw/engine.cpp +++ b/apps/openmw/engine.cpp @@ -154,14 +154,23 @@ bool OMW::Engine::frame(float frametime) mEnvironment.getStateManager()->endGame(); } + // update physics + osg::Timer_t beforePhysicsTick = osg::Timer::instance()->tick(); + if (mEnvironment.getStateManager()->getState()!= + MWBase::StateManager::State_NoGame) + { + mEnvironment.getWorld()->updatePhysics(frametime, guiActive); + } + osg::Timer_t afterPhysicsTick = osg::Timer::instance()->tick(); + // update world - osg::Timer_t beforePhysicsTick = osg::Timer::instance()->tick();; + osg::Timer_t beforeWorldTick = osg::Timer::instance()->tick(); if (mEnvironment.getStateManager()->getState()!= MWBase::StateManager::State_NoGame) { mEnvironment.getWorld()->update(frametime, guiActive); } - osg::Timer_t afterPhysicsTick = osg::Timer::instance()->tick(); + osg::Timer_t afterWorldTick = osg::Timer::instance()->tick(); // update GUI mEnvironment.getWindowManager()->onFrame(frametime); @@ -180,6 +189,10 @@ bool OMW::Engine::frame(float frametime) stats->setAttribute(frameNumber, "physics_time_taken", osg::Timer::instance()->delta_s(beforePhysicsTick, afterPhysicsTick)); stats->setAttribute(frameNumber, "physics_time_end", osg::Timer::instance()->delta_s(mStartTick, afterPhysicsTick)); + stats->setAttribute(frameNumber, "world_time_begin", osg::Timer::instance()->delta_s(mStartTick, beforeWorldTick)); + stats->setAttribute(frameNumber, "world_time_taken", osg::Timer::instance()->delta_s(beforeWorldTick, afterWorldTick)); + stats->setAttribute(frameNumber, "world_time_end", osg::Timer::instance()->delta_s(mStartTick, afterWorldTick)); + if (stats->collectStats("resource")) { mResourceSystem->reportStats(frameNumber, stats); @@ -667,10 +680,12 @@ void OMW::Engine::go() statshandler->addUserStatsLine("Script", osg::Vec4f(1.f, 1.f, 1.f, 1.f), osg::Vec4f(1.f, 1.f, 1.f, 1.f), "script_time_taken", 1000.0, true, false, "script_time_begin", "script_time_end", 10000); - statshandler->addUserStatsLine("Mechanics", osg::Vec4f(1.f, 1.f, 1.f, 1.f), osg::Vec4f(1.f, 1.f, 1.f, 1.f), + statshandler->addUserStatsLine("Mech", osg::Vec4f(1.f, 1.f, 1.f, 1.f), osg::Vec4f(1.f, 1.f, 1.f, 1.f), "mechanics_time_taken", 1000.0, true, false, "mechanics_time_begin", "mechanics_time_end", 10000); - statshandler->addUserStatsLine("Physics", osg::Vec4f(1.f, 1.f, 1.f, 1.f), osg::Vec4f(1.f, 1.f, 1.f, 1.f), + statshandler->addUserStatsLine("Phys", osg::Vec4f(1.f, 1.f, 1.f, 1.f), osg::Vec4f(1.f, 1.f, 1.f, 1.f), "physics_time_taken", 1000.0, true, false, "physics_time_begin", "physics_time_end", 10000); + statshandler->addUserStatsLine("World", osg::Vec4f(1.f, 1.f, 1.f, 1.f), osg::Vec4f(1.f, 1.f, 1.f, 1.f), + "world_time_taken", 1000.0, true, false, "world_time_begin", "world_time_end", 10000); mViewer->addEventHandler(statshandler); diff --git a/apps/openmw/mwbase/world.hpp b/apps/openmw/mwbase/world.hpp index dfae5700bb..429a128809 100644 --- a/apps/openmw/mwbase/world.hpp +++ b/apps/openmw/mwbase/world.hpp @@ -371,6 +371,7 @@ namespace MWBase /// \return pointer to created record virtual void update (float duration, bool paused) = 0; + virtual void updatePhysics (float duration, bool paused) = 0; virtual void updateWindowManager () = 0; diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index 181fa0742b..4834505dc6 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -1817,7 +1817,6 @@ namespace MWWorld if (!paused) { - doPhysics (duration); updateNavigator(); } @@ -1837,6 +1836,14 @@ namespace MWWorld } } + void World::updatePhysics (float duration, bool paused) + { + if (!paused) + { + doPhysics (duration); + } + } + void World::updatePlayer() { MWWorld::Ptr player = getPlayerPtr(); diff --git a/apps/openmw/mwworld/worldimp.hpp b/apps/openmw/mwworld/worldimp.hpp index 51953cd40c..bfd3e918cf 100644 --- a/apps/openmw/mwworld/worldimp.hpp +++ b/apps/openmw/mwworld/worldimp.hpp @@ -480,6 +480,7 @@ namespace MWWorld /// \return pointer to created record void update (float duration, bool paused) override; + void updatePhysics (float duration, bool paused) override; void updateWindowManager () override;