From 0e6bb132c87dd675bad47c11b7a082ded252baa1 Mon Sep 17 00:00:00 2001 From: Christoph Urlacher Date: Tue, 24 Feb 2026 02:05:44 +0100 Subject: [PATCH] wip: don't lock command mutex for each mass/spring in FillGraph() --- include/config.hpp | 2 +- include/physics.hpp | 4 ++++ src/physics.cpp | 9 +++++++++ src/state.cpp | 17 ++++++++++++----- 4 files changed, 26 insertions(+), 6 deletions(-) diff --git a/include/config.hpp b/include/config.hpp index 7440163..88029bf 100644 --- a/include/config.hpp +++ b/include/config.hpp @@ -30,7 +30,7 @@ constexpr float ROT_SPEED = 1.0; constexpr float CAMERA_SMOOTH_SPEED = 15.0; // Physics Engine -constexpr float SIM_SPEED = 4.0; // How large each update should be +constexpr float SIM_SPEED = 0.2; // How large each update should be constexpr float TIMESTEP = 1.0 / 90; // Do 90 physics updates per second constexpr float MASS = 1.0; // Mass spring system constexpr float SPRING_CONSTANT = 5.0; // Mass spring system diff --git a/include/physics.hpp b/include/physics.hpp index 92f96be..6e8349e 100644 --- a/include/physics.hpp +++ b/include/physics.hpp @@ -188,6 +188,10 @@ public: auto AddSpringCmd(const State &a, const State &b) -> void; auto ClearCmd() -> void; + + auto NonLockingAddMassCmd(const State &_state) -> void; + + auto NonLockingAddSpringCmd(const State &a, const State &b) -> void; }; // https://en.cppreference.com/w/cpp/utility/variant/visit diff --git a/src/physics.cpp b/src/physics.cpp index 850cc7f..ce040da 100644 --- a/src/physics.cpp +++ b/src/physics.cpp @@ -402,3 +402,12 @@ auto ThreadedPhysics::ClearCmd() -> void { state.pending_commands.push(ClearGraph{}); } } + +auto ThreadedPhysics::NonLockingAddMassCmd(const State &_state) -> void { + state.pending_commands.push(AddMass{_state}); +} + +auto ThreadedPhysics::NonLockingAddSpringCmd(const State &a, const State &b) + -> void { + state.pending_commands.push(AddSpring{a, b}); +} diff --git a/src/state.cpp b/src/state.cpp index a49b663..2984f4e 100644 --- a/src/state.cpp +++ b/src/state.cpp @@ -37,12 +37,19 @@ auto StateManager::FillGraph() -> void { std::pair, std::vector>> closure = current_state.Closure(); - for (const auto &state : closure.first) { - physics.AddMassCmd(state); - } - for (const auto &[from, to] : closure.second) { - physics.AddSpringCmd(from, to); + + { + std::lock_guard lock(physics.state.command_mtx); + for (const auto &state : closure.first) { + physics.NonLockingAddMassCmd(state); + } + for (const auto &[from, to] : closure.second) { + physics.NonLockingAddSpringCmd(from, to); + } } + + // TODO: We have only dispatched the commands, the states won't be downloaded + // when calling this... Make FindWinningStates() another command? FindWinningStates(); }