application::application(settings& settings) :
last_update_(timer::ticks()),
- total_time_(SCALAR(0.0)),
accum_(SCALAR(0.0))
{
unsigned random_seed;
settings.get("framerate", framerate);
framerate = SCALAR(1.0) / framerate;
- //timer::default_source().scale(SCALAR(1.2));
+ //timer::default_source().scale(SCALAR(0.76));
- //update_timer_.init(boost::bind(&application::dispatch_update, this, _1, _2),
- //timestep_, timer::repeat, this);
- next_update_ = update_timer_.expiration();
+ //update_timer_.init(boost::bind(&application::dispatch_update,
+ //this, _1, _2),
+ //timestep_, timer::repeat);
+ //add_timer(update_timer_);
+
+ game_time_.reset(timestep_);
- draw_timer_.init(boost::bind(&application::dispatch_draw, this, _1, _2),
- framerate, timer::repeat);
+ draw_timer_.init(boost::bind(&application::dispatch_draw,
+ this, _1, _2), framerate, timer::repeat);
add_timer(draw_timer_);
}
}
- //const int MAX_FRAMESKIP = 15;
+ const int MAX_CONSECUTIVE_UPDATES = 15;
log_debug("updating", timer.expiration(), "/", t);
- //int i = 0;
- //while (next_update_ < t && ++i < MAX_FRAMESKIP)
- //{
- //total_time_ += timestep_;
- //update(total_time_, timestep_);
-
- //next_update_ += timestep_;
- //log_debug("updated", next_update_, "time:", timer::ticks());
- //}
-
scalar deltaTime = t - last_update_;
accum_ += deltaTime;
- while (timestep_ <= accum_)
+ int i = 0;
+ while (timestep_ <= accum_ && i < MAX_CONSECUTIVE_UPDATES)
{
log_debug("UPDATING");
- update(total_time_, timestep_);
- total_time_ += timestep_;
+ update(game_time_.ticks(), timestep_);
+ game_time_.step();
accum_ -= timestep_;
}
void application::dispatch_draw(timer& timer, scalar t)
{
- log_debug("next update", update_timer_.expiration());
log_debug("draw", timer.expiration(), "/", t);
+ // XXX temporary
+ thread::main_runloop().run_once();
+
dispatch_update(timer, t);
- //if (t < next_update_ - timestep_) return;
- //scalar alpha = (t + timestep_ - next_update_) * inverse_timestep_;
- //scalar alpha = (t + timestep_ - update_timer_.expiration()) * inverse_timestep_;
- //scalar alpha = (next_update_ - t) * inverse_timestep_;
scalar alpha = accum_ * inverse_timestep_;
- //if (alpha < SCALAR(0.0) || SCALAR(1.0) < alpha) return;
alpha = cml::clamp(alpha, SCALAR(-1.0), SCALAR(2.0));
if (alpha < SCALAR(0.0)) log_warning("alpha:", alpha);