]> git.tdb.fi Git - libs/game.git/commitdiff
Move System tick bracketing to SystemScheduler
authorMikko Rasa <tdb@tdb.fi>
Sun, 23 Mar 2025 11:32:48 +0000 (13:32 +0200)
committerMikko Rasa <tdb@tdb.fi>
Sun, 23 Mar 2025 11:33:26 +0000 (13:33 +0200)
source/game/system.cpp
source/game/system.h
source/game/systemscheduler.cpp
source/game/systemscheduler.h

index 1411a8de45da9bbb37066171e6aeb84b5539009f..e652f4c3cc3a4943084759614366072f3a6325c5 100644 (file)
@@ -10,29 +10,6 @@ System *&System::get_active_ptr()
        return active;
 }
 
-void System::begin_tick()
-{
-       System *&active = get_active_ptr();
-       if(active)
-               throw logic_error("System::active != nullptr");
-       active = this;
-
-       for(const Dependency &d: dependencies)
-               if(d.transactor)
-                       d.transactor->prepare(d.transact_mode);
-}
-
-void System::end_tick()
-{
-       for(const Dependency &d: dependencies)
-               if(d.transactor)
-                       d.transactor->commit(d.transact_mode);
-
-       System *&active = get_active_ptr();
-       if(active==this)
-               active = nullptr;
-}
-
 void System::deferred_tick()
 {
        for(const auto &f: deferred_queue)
index 2cfe52a56a19852b633af7fba0df2584bcd5f5ec..51b032b0ac0492eb350ed2a8fee61c65e7c69a48 100644 (file)
@@ -47,16 +47,8 @@ public:
 
                DependencyFlags get_flags() const { return flags; }
                const Reflection::ClassBase &get_type() const { return type; }
-       };
-
-       class Activator: public NonCopyable
-       {
-       private:
-               System &system;
-
-       public:
-               Activator(System &s): system(s) { system.begin_tick(); }
-               ~Activator() { system.end_tick(); }
+               Transactor *get_transactor() const { return transactor; }
+               Transactor::Mode get_transact_mode() const { return transact_mode; }
        };
 
 protected:
@@ -82,9 +74,7 @@ private:
 
 public:
        virtual void early_tick() { }
-       void begin_tick();
        virtual void tick(Time::TimeDelta) = 0;
-       void end_tick();
        virtual void deferred_tick();
 
 protected:
index 0a15a300d1b6551dc6b24d63b6e5408224e99c20..329e4a1e15ec345701f38c2f338790573fe35e6a 100644 (file)
@@ -156,18 +156,31 @@ void SystemScheduler::run(Time::TimeDelta dt)
                for(size_t i=0; i<nodes.size(); ++i)
                        if(!(pending&nodes[i].prerequisites))
                        {
-                               System::Activator act(*nodes[i].system);
-                               try
-                               {
-                                       nodes[i].system->tick(dt);
-                               }
-                               catch(const invalid_access &exc)
-                               {
-                                       throw invalid_access(format("%s by %s", exc.what(), nodes[i].type->get_name()));
-                               }
+                               run_system(i, dt);
                                pending &= ~(1ULL<<i);
                        }
        }
 }
 
+void SystemScheduler::run_system(size_t index, Time::TimeDelta dt)
+{
+       System &sys = *nodes[index].system;
+       for(const System::Dependency &d: sys.get_dependencies())
+               if(Transactor *tract = d.get_transactor())
+                       tract->prepare(d.get_transact_mode());
+
+       try
+       {
+               sys.tick(dt);
+       }
+       catch(const invalid_access &exc)
+       {
+               throw invalid_access(format("%s by %s", exc.what(), nodes[index].type->get_name()));
+       }
+
+       for(const System::Dependency &d: sys.get_dependencies())
+               if(Transactor *tract = d.get_transactor())
+                       tract->commit(d.get_transact_mode());
+}
+
 } // namespace Msp::Game
index f7c1ebd43e8c974a9700dc4a7eed9ce3b3407de1..4472677e2070fd842af07a44c99f3ab24f0e939f 100644 (file)
@@ -51,6 +51,8 @@ public:
        const std::vector<GraphNode> &get_graph() const { return nodes; }
 
        void run(Time::TimeDelta);
+private:
+       void run_system(std::size_t, Time::TimeDelta);
 };
 
 } // namespace Msp::Game