2
#include <boost/shared_ptr.hpp>
15
void set_fixed(int step) {
18
last_time_ = get_current_time_in_ms();
22
void set_game_timer() {
25
last_time_ = get_current_time_in_ms();
28
void update_frame_time() {
29
frame_time_ = get_elapsed_time();
30
if(frame_time_ > 0.25) {
35
accumulator_ += frame_time_;
44
double fixed_step = get_fixed_step();
45
if(accumulator_ >= fixed_step) {
46
accumulator_ -= fixed_step;
53
double get_fixed_step() {
54
return 1.0 / double(step_);
57
double get_delta_time() {
59
return get_fixed_step();
65
double get_elapsed_time() {
66
long current_time = get_current_time_in_ms();
67
double elapsed = double(current_time - last_time_) * 0.001;
68
last_time_ = current_time;
72
long get_current_time_in_ms() {
77
clock_gettime(CLOCK_REALTIME, &ts);
78
return (long) (ts.tv_sec * 1000.0) + ts.tv_nsec / 1000000.0;
91
static std::map<KTIuint, boost::shared_ptr<Timer> > timers_;
93
static KTIuint bound_timer_id_ = 0;
94
static KTIuint current_timer_id_ = 0;
96
KTIuint get_next_timer_id() {
97
return ++current_timer_id_;
100
Timer* get_bound_timer() {
101
if(timers_.find(bound_timer_id_) == timers_.end()) {
105
return timers_[bound_timer_id_].get();
108
void ktiGenTimers(KTIsizei n, KTIuint* names) {
109
for(KTIuint i = 0; i < n; ++i) {
110
KTIuint new_id = get_next_timer_id();
111
timers_[new_id].reset(new Timer());
116
void ktiBindTimer(KTIuint name) {
117
if(timers_.find(name) == timers_.end()) {
121
bound_timer_id_ = name;
124
void ktiStartFixedStepTimer(KTIint steps_per_second) {
125
Timer* timer = get_bound_timer();
130
timer->set_fixed(steps_per_second);
133
void ktiStartGameTimer() {
134
Timer* timer = get_bound_timer();
139
timer->set_game_timer();
142
KTIbool ktiTimerCanUpdate() {
143
Timer* timer = get_bound_timer();
148
return timer->can_update();
151
void ktiUpdateFrameTime() {
152
Timer* timer = get_bound_timer();
157
timer->update_frame_time();
160
KTIdouble ktiGetDeltaTime() {
161
Timer* timer = get_bound_timer();
166
return timer->get_delta_time();
169
void ktiDeleteTimers(KTIsizei n, const KTIuint* names) {
170
for(KTIuint i = 0; i < n; ++i) {
171
timers_.erase(names[i]);