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();
}
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();
void synthesize_initial_events(Handle<Entity>, EventObserver &);
public:
- void tick(Time::TimeDelta);
+ void tick(Time::TimeDelta, Time::TimeDelta);
};
template<typename T, typename F>
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:
}
}
-void SystemScheduler::run(Time::TimeDelta dt)
+void SystemScheduler::run(Time::TimeDelta dt, Time::TimeDelta backlog)
{
if(nodes.empty())
return;
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())
try
{
- sys.tick(dt);
+ sys.tick(dt, backlog);
}
catch(const invalid_access &exc)
{
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);
};