]> git.tdb.fi Git - libs/game.git/commitdiff
Pass more information about tick timing to systems
authorMikko Rasa <tdb@tdb.fi>
Wed, 2 Apr 2025 10:30:45 +0000 (13:30 +0300)
committerMikko Rasa <tdb@tdb.fi>
Wed, 2 Apr 2025 10:30:45 +0000 (13:30 +0300)
They now get the remaining amount of backlog, which allows detecting if
catch up is happening or processing partial ticks.

source/game/director.cpp
source/game/stage.cpp
source/game/stage.h
source/game/system.h
source/game/systemscheduler.cpp
source/game/systemscheduler.h

index 374f91e5a688d39cfcd313b0dd4d093b4d77c286..ad35f8866864d52281bb5789888f1a8d35ea6179 100644 (file)
@@ -58,9 +58,28 @@ void Director::tick()
        last_tick = now;
 
        backlog = min(backlog+dt, stepsize*max_backlog_steps);
-       for(unsigned i=0; (i<max_steps_per_frame && backlog>=stepsize); ++i, backlog-=stepsize)
+
+       Time::TimeDelta frame_backlog = backlog;
+       if(frame_backlog>=stepsize*(max_steps_per_frame+1))
+               frame_backlog = stepsize*max_steps_per_frame;
+
+       if(frame_backlog<stepsize)
+       {
                for(const auto &s: stages)
-                       s->tick(stepsize);
+                       s->tick(Time::zero, frame_backlog);
+       }
+       else
+       {
+               Time::TimeDelta processed;
+               while(processed+stepsize<=frame_backlog)
+               {
+                       processed += stepsize;
+                       for(const auto &s: stages)
+                               s->tick(stepsize, frame_backlog-processed);
+               }
+
+               backlog -= processed;
+       }
 
        networking.reap_connections();
 }
index 059b9abfa8cbc0a775ce6c168d53918cb004f3c5..4f66586236b0392847a338833aba3a9afc493d13 100644 (file)
@@ -81,12 +81,12 @@ void Stage::synthesize_initial_events(Handle<Entity> entity, EventObserver &targ
        event_source.emit_to<Events::EntityCreated>(target_observer, entity);
 }
 
-void Stage::tick(Time::TimeDelta dt)
+void Stage::tick(Time::TimeDelta dt, Time::TimeDelta backlog)
 {
        for(const auto &s: systems)
                s->early_tick();
 
-       scheduler.run(dt);
+       scheduler.run(dt, backlog);
 
        for(const auto &s: systems)
                s->deferred_tick();
index 00b9047bcfa3021dc90d78ae61a1e9efde2ef640..c27058eccc2bae9d0e14fe4fb6b0b9d4f76e2d18 100644 (file)
@@ -87,7 +87,7 @@ private:
        void synthesize_initial_events(Handle<Entity>, EventObserver &);
 
 public:
-       void tick(Time::TimeDelta);
+       void tick(Time::TimeDelta, Time::TimeDelta);
 };
 
 template<typename T, typename F>
index 84671c2b7238bb3824f6e27b2b679b11d82eba21..372fb03ea54aa46bdf2ba61ad39ed4129d40f86f 100644 (file)
@@ -75,6 +75,7 @@ private:
 public:
        virtual void early_tick() { }
        virtual void tick(Time::TimeDelta) = 0;
+       virtual void tick(Time::TimeDelta dt, Time::TimeDelta) { if(dt>Time::zero) tick(dt); }
        virtual void deferred_tick();
 
 protected:
index 1b82b5435b946a1200138b723f11ad95e0147e6f..1b1bc137afe84cd9528746999f397e34b0369d8e 100644 (file)
@@ -195,7 +195,7 @@ void SystemScheduler::for_common_deps(const GraphNode &node1, const GraphNode &n
        }
 }
 
-void SystemScheduler::run(Time::TimeDelta dt)
+void SystemScheduler::run(Time::TimeDelta dt, Time::TimeDelta backlog)
 {
        if(nodes.empty())
                return;
@@ -229,14 +229,14 @@ void SystemScheduler::run(Time::TimeDelta dt)
                if(run_index>=0)
                {
                        started |= 1ULL<<run_index;
-                       run_system(run_index, dt);
+                       run_system(run_index, dt, backlog);
                }
                else if(commit_index>=0)
                        commit_system(commit_index);
        }
 }
 
-void SystemScheduler::run_system(size_t index, Time::TimeDelta dt)
+void SystemScheduler::run_system(size_t index, Time::TimeDelta dt, Time::TimeDelta backlog)
 {
        System &sys = *nodes[index].system;
        for(const System::Dependency &d: sys.get_dependencies())
@@ -248,7 +248,7 @@ void SystemScheduler::run_system(size_t index, Time::TimeDelta dt)
 
        try
        {
-               sys.tick(dt);
+               sys.tick(dt, backlog);
        }
        catch(const invalid_access &exc)
        {
index c11bb504883d20c118c1248413c398b29f0d5f9b..576a188128b0de0882fa77ab1d92b411c3b7c726 100644 (file)
@@ -55,9 +55,9 @@ private:
 public:
        const std::vector<GraphNode> &get_graph() const { return nodes; }
 
-       void run(Time::TimeDelta);
+       void run(Time::TimeDelta, Time::TimeDelta);
 private:
-       void run_system(std::size_t, Time::TimeDelta);
+       void run_system(std::size_t, Time::TimeDelta, Time::TimeDelta);
        void commit_system(std::size_t);
 };