mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-03 14:45:37 +00:00
Add the async physics worker to the profiler overlay.
This commit is contained in:
parent
881bc49e0b
commit
9aba55a21a
8 changed files with 49 additions and 13 deletions
|
@ -94,6 +94,7 @@ namespace
|
||||||
Script,
|
Script,
|
||||||
Mechanics,
|
Mechanics,
|
||||||
Physics,
|
Physics,
|
||||||
|
PhysicsWorker,
|
||||||
World,
|
World,
|
||||||
Gui,
|
Gui,
|
||||||
|
|
||||||
|
@ -124,6 +125,9 @@ namespace
|
||||||
template <>
|
template <>
|
||||||
const UserStats UserStatsValue<UserStatsType::Physics>::sValue {"Phys", "physics"};
|
const UserStats UserStatsValue<UserStatsType::Physics>::sValue {"Phys", "physics"};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
const UserStats UserStatsValue<UserStatsType::PhysicsWorker>::sValue {" -Async", "physicsworker"};
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
const UserStats UserStatsValue<UserStatsType::World>::sValue {"World", "world"};
|
const UserStats UserStatsValue<UserStatsType::World>::sValue {"World", "world"};
|
||||||
|
|
||||||
|
@ -203,6 +207,10 @@ namespace
|
||||||
profiler.addUserStatsLine(v.mLabel, textColor, barColor, v.mTaken, multiplier,
|
profiler.addUserStatsLine(v.mLabel, textColor, barColor, v.mTaken, multiplier,
|
||||||
average, averageInInverseSpace, v.mBegin, v.mEnd, maxValue);
|
average, averageInInverseSpace, v.mBegin, v.mEnd, maxValue);
|
||||||
});
|
});
|
||||||
|
// the forEachUserStatsValue loop is "run" at compile time, hence the settings manager is not available.
|
||||||
|
// Unconditionnally add the async physics stats, and then remove it at runtime if necessary
|
||||||
|
if (Settings::Manager::getInt("async num threads", "Physics") == 0)
|
||||||
|
profiler.removeUserStatsLine(" -Async");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -318,7 +326,7 @@ bool OMW::Engine::frame(float frametime)
|
||||||
|
|
||||||
if (mEnvironment.getStateManager()->getState() != MWBase::StateManager::State_NoGame)
|
if (mEnvironment.getStateManager()->getState() != MWBase::StateManager::State_NoGame)
|
||||||
{
|
{
|
||||||
mEnvironment.getWorld()->updatePhysics(frametime, guiActive);
|
mEnvironment.getWorld()->updatePhysics(frametime, guiActive, frameStart, frameNumber, *stats);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
|
|
||||||
#include <components/esm/cellid.hpp>
|
#include <components/esm/cellid.hpp>
|
||||||
|
|
||||||
|
#include <osg/Timer>
|
||||||
|
|
||||||
#include "../mwworld/ptr.hpp"
|
#include "../mwworld/ptr.hpp"
|
||||||
#include "../mwworld/doorstate.hpp"
|
#include "../mwworld/doorstate.hpp"
|
||||||
|
|
||||||
|
@ -391,7 +393,7 @@ namespace MWBase
|
||||||
/// \return pointer to created record
|
/// \return pointer to created record
|
||||||
|
|
||||||
virtual void update (float duration, bool paused) = 0;
|
virtual void update (float duration, bool paused) = 0;
|
||||||
virtual void updatePhysics (float duration, bool paused) = 0;
|
virtual void updatePhysics (float duration, bool paused, osg::Timer_t frameStart, unsigned int frameNumber, osg::Stats& stats) = 0;
|
||||||
|
|
||||||
virtual void updateWindowManager () = 0;
|
virtual void updateWindowManager () = 0;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
#include <BulletCollision/BroadphaseCollision/btDbvtBroadphase.h>
|
#include <BulletCollision/BroadphaseCollision/btDbvtBroadphase.h>
|
||||||
#include <BulletCollision/CollisionShapes/btCollisionShape.h>
|
#include <BulletCollision/CollisionShapes/btCollisionShape.h>
|
||||||
|
|
||||||
|
#include <osg/Stats>
|
||||||
|
|
||||||
#include "components/debug/debuglog.hpp"
|
#include "components/debug/debuglog.hpp"
|
||||||
#include <components/misc/barrier.hpp>
|
#include <components/misc/barrier.hpp>
|
||||||
#include "components/misc/convert.hpp"
|
#include "components/misc/convert.hpp"
|
||||||
|
@ -154,6 +156,8 @@ namespace MWPhysics
|
||||||
, mQuit(false)
|
, mQuit(false)
|
||||||
, mNextJob(0)
|
, mNextJob(0)
|
||||||
, mNextLOS(0)
|
, mNextLOS(0)
|
||||||
|
, mFrameNumber(0)
|
||||||
|
, mTimer(osg::Timer::instance())
|
||||||
{
|
{
|
||||||
mNumThreads = Config::computeNumThreads(mThreadSafeBullet);
|
mNumThreads = Config::computeNumThreads(mThreadSafeBullet);
|
||||||
|
|
||||||
|
@ -192,6 +196,7 @@ namespace MWPhysics
|
||||||
[](const LOSRequest& req) { return req.mStale; }),
|
[](const LOSRequest& req) { return req.mStale; }),
|
||||||
mLOSCache.end());
|
mLOSCache.end());
|
||||||
}
|
}
|
||||||
|
mTimeEnd = mTimer->tick();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -207,7 +212,7 @@ namespace MWPhysics
|
||||||
thread.join();
|
thread.join();
|
||||||
}
|
}
|
||||||
|
|
||||||
const PtrPositionList& PhysicsTaskScheduler::moveActors(int numSteps, float timeAccum, std::vector<ActorFrameData>&& actorsData, bool skipSimulation)
|
const PtrPositionList& PhysicsTaskScheduler::moveActors(int numSteps, float timeAccum, std::vector<ActorFrameData>&& actorsData, bool skipSimulation, osg::Timer_t frameStart, unsigned int frameNumber, osg::Stats& stats)
|
||||||
{
|
{
|
||||||
// This function run in the main thread.
|
// This function run in the main thread.
|
||||||
// While the mSimulationMutex is held, background physics threads can't run.
|
// While the mSimulationMutex is held, background physics threads can't run.
|
||||||
|
@ -230,6 +235,16 @@ namespace MWPhysics
|
||||||
if (mMovementResults.find(data.mPtr) != mMovementResults.end())
|
if (mMovementResults.find(data.mPtr) != mMovementResults.end())
|
||||||
data.mActorRaw->setNextPosition(mMovementResults[data.mPtr]);
|
data.mActorRaw->setNextPosition(mMovementResults[data.mPtr]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mFrameNumber == frameNumber - 1)
|
||||||
|
{
|
||||||
|
stats.setAttribute(mFrameNumber, "physicsworker_time_begin", mTimer->delta_s(mFrameStart, mTimeBegin));
|
||||||
|
stats.setAttribute(mFrameNumber, "physicsworker_time_taken", mTimer->delta_s(mTimeBegin, mTimeEnd));
|
||||||
|
stats.setAttribute(mFrameNumber, "physicsworker_time_end", mTimer->delta_s(mFrameStart, mTimeEnd));
|
||||||
|
}
|
||||||
|
mFrameStart = frameStart;
|
||||||
|
mTimeBegin = mTimer->tick();
|
||||||
|
mFrameNumber = frameNumber;
|
||||||
}
|
}
|
||||||
|
|
||||||
// init
|
// init
|
||||||
|
|
|
@ -9,6 +9,8 @@
|
||||||
|
|
||||||
#include <BulletCollision/CollisionDispatch/btCollisionWorld.h>
|
#include <BulletCollision/CollisionDispatch/btCollisionWorld.h>
|
||||||
|
|
||||||
|
#include <osg/Timer>
|
||||||
|
|
||||||
#include "physicssystem.hpp"
|
#include "physicssystem.hpp"
|
||||||
#include "ptrholder.hpp"
|
#include "ptrholder.hpp"
|
||||||
|
|
||||||
|
@ -30,7 +32,7 @@ namespace MWPhysics
|
||||||
/// @param timeAccum accumulated time from previous run to interpolate movements
|
/// @param timeAccum accumulated time from previous run to interpolate movements
|
||||||
/// @param actorsData per actor data needed to compute new positions
|
/// @param actorsData per actor data needed to compute new positions
|
||||||
/// @return new position of each actor
|
/// @return new position of each actor
|
||||||
const PtrPositionList& moveActors(int numSteps, float timeAccum, std::vector<ActorFrameData>&& actorsData, bool skip);
|
const PtrPositionList& moveActors(int numSteps, float timeAccum, std::vector<ActorFrameData>&& actorsData, bool skip, osg::Timer_t frameStart, unsigned int frameNumber, osg::Stats& stats);
|
||||||
|
|
||||||
// Thread safe wrappers
|
// Thread safe wrappers
|
||||||
void rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, btCollisionWorld::RayResultCallback& resultCallback) const;
|
void rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, btCollisionWorld::RayResultCallback& resultCallback) const;
|
||||||
|
@ -87,6 +89,12 @@ namespace MWPhysics
|
||||||
mutable std::shared_mutex mLOSCacheMutex;
|
mutable std::shared_mutex mLOSCacheMutex;
|
||||||
mutable std::mutex mUpdateAabbMutex;
|
mutable std::mutex mUpdateAabbMutex;
|
||||||
std::condition_variable_any mHasJob;
|
std::condition_variable_any mHasJob;
|
||||||
|
|
||||||
|
unsigned int mFrameNumber;
|
||||||
|
const osg::Timer* mTimer;
|
||||||
|
osg::Timer_t mTimeBegin;
|
||||||
|
osg::Timer_t mTimeEnd;
|
||||||
|
osg::Timer_t mFrameStart;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <osg/Group>
|
#include <osg/Group>
|
||||||
#include <osg/Stats>
|
#include <osg/Stats>
|
||||||
|
#include <osg/Timer>
|
||||||
|
|
||||||
#include <BulletCollision/CollisionShapes/btConeShape.h>
|
#include <BulletCollision/CollisionShapes/btConeShape.h>
|
||||||
#include <BulletCollision/CollisionShapes/btSphereShape.h>
|
#include <BulletCollision/CollisionShapes/btSphereShape.h>
|
||||||
|
@ -665,7 +666,7 @@ namespace MWPhysics
|
||||||
mMovementQueue.clear();
|
mMovementQueue.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
const PtrPositionList& PhysicsSystem::applyQueuedMovement(float dt, bool skipSimulation)
|
const PtrPositionList& PhysicsSystem::applyQueuedMovement(float dt, bool skipSimulation, osg::Timer_t frameStart, unsigned int frameNumber, osg::Stats& stats)
|
||||||
{
|
{
|
||||||
mTimeAccum += dt;
|
mTimeAccum += dt;
|
||||||
|
|
||||||
|
@ -675,7 +676,7 @@ namespace MWPhysics
|
||||||
|
|
||||||
mTimeAccum -= numSteps * mPhysicsDt;
|
mTimeAccum -= numSteps * mPhysicsDt;
|
||||||
|
|
||||||
return mTaskScheduler->moveActors(numSteps, mTimeAccum, prepareFrameData(numSteps), skipSimulation);
|
return mTaskScheduler->moveActors(numSteps, mTimeAccum, prepareFrameData(numSteps), skipSimulation, frameStart, frameNumber, stats);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<ActorFrameData> PhysicsSystem::prepareFrameData(int numSteps)
|
std::vector<ActorFrameData> PhysicsSystem::prepareFrameData(int numSteps)
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include <osg/Quat>
|
#include <osg/Quat>
|
||||||
#include <osg/BoundingBox>
|
#include <osg/BoundingBox>
|
||||||
#include <osg/ref_ptr>
|
#include <osg/ref_ptr>
|
||||||
|
#include <osg/Timer>
|
||||||
|
|
||||||
#include "../mwworld/ptr.hpp"
|
#include "../mwworld/ptr.hpp"
|
||||||
|
|
||||||
|
@ -200,7 +201,7 @@ namespace MWPhysics
|
||||||
void queueObjectMovement(const MWWorld::Ptr &ptr, const osg::Vec3f &velocity);
|
void queueObjectMovement(const MWWorld::Ptr &ptr, const osg::Vec3f &velocity);
|
||||||
|
|
||||||
/// Apply all queued movements, then clear the list.
|
/// Apply all queued movements, then clear the list.
|
||||||
const PtrPositionList& applyQueuedMovement(float dt, bool skipSimulation);
|
const PtrPositionList& applyQueuedMovement(float dt, bool skipSimulation, osg::Timer_t frameStart, unsigned int frameNumber, osg::Stats& stats);
|
||||||
|
|
||||||
/// Clear the queued movements list without applying.
|
/// Clear the queued movements list without applying.
|
||||||
void clearQueuedMovement();
|
void clearQueuedMovement();
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include <osg/Group>
|
#include <osg/Group>
|
||||||
#include <osg/ComputeBoundsVisitor>
|
#include <osg/ComputeBoundsVisitor>
|
||||||
|
#include <osg/Timer>
|
||||||
|
|
||||||
#include <BulletCollision/CollisionDispatch/btCollisionWorld.h>
|
#include <BulletCollision/CollisionDispatch/btCollisionWorld.h>
|
||||||
#include <BulletCollision/CollisionShapes/btCompoundShape.h>
|
#include <BulletCollision/CollisionShapes/btCompoundShape.h>
|
||||||
|
@ -1494,14 +1495,14 @@ namespace MWWorld
|
||||||
mPhysics->updateAnimatedCollisionShape(ptr);
|
mPhysics->updateAnimatedCollisionShape(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::doPhysics(float duration)
|
void World::doPhysics(float duration, osg::Timer_t frameStart, unsigned int frameNumber, osg::Stats& stats)
|
||||||
{
|
{
|
||||||
mPhysics->stepSimulation();
|
mPhysics->stepSimulation();
|
||||||
processDoors(duration);
|
processDoors(duration);
|
||||||
|
|
||||||
mProjectileManager->update(duration);
|
mProjectileManager->update(duration);
|
||||||
|
|
||||||
const auto results = mPhysics->applyQueuedMovement(duration, mDiscardMovements);
|
const auto results = mPhysics->applyQueuedMovement(duration, mDiscardMovements, frameStart, frameNumber, stats);
|
||||||
mDiscardMovements = false;
|
mDiscardMovements = false;
|
||||||
|
|
||||||
for(const auto& [actor, position]: results)
|
for(const auto& [actor, position]: results)
|
||||||
|
@ -1830,11 +1831,11 @@ namespace MWWorld
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void World::updatePhysics (float duration, bool paused)
|
void World::updatePhysics (float duration, bool paused, osg::Timer_t frameStart, unsigned int frameNumber, osg::Stats& stats)
|
||||||
{
|
{
|
||||||
if (!paused)
|
if (!paused)
|
||||||
{
|
{
|
||||||
doPhysics (duration);
|
doPhysics (duration, frameStart, frameNumber, stats);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -157,7 +157,7 @@ namespace MWWorld
|
||||||
void processDoors(float duration);
|
void processDoors(float duration);
|
||||||
///< Run physics simulation and modify \a world accordingly.
|
///< Run physics simulation and modify \a world accordingly.
|
||||||
|
|
||||||
void doPhysics(float duration);
|
void doPhysics(float duration, osg::Timer_t frameStart, unsigned int frameNumber, osg::Stats& stats);
|
||||||
///< Run physics simulation and modify \a world accordingly.
|
///< Run physics simulation and modify \a world accordingly.
|
||||||
|
|
||||||
void updateNavigator();
|
void updateNavigator();
|
||||||
|
@ -493,7 +493,7 @@ namespace MWWorld
|
||||||
/// \return pointer to created record
|
/// \return pointer to created record
|
||||||
|
|
||||||
void update (float duration, bool paused) override;
|
void update (float duration, bool paused) override;
|
||||||
void updatePhysics (float duration, bool paused) override;
|
void updatePhysics (float duration, bool paused, osg::Timer_t frameStart, unsigned int frameNumber, osg::Stats& stats) override;
|
||||||
|
|
||||||
void updateWindowManager () override;
|
void updateWindowManager () override;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue