From 445505ada572fbf7be3ce474a1af31419ff68c2b Mon Sep 17 00:00:00 2001 From: Paweł Redman Date: Thu, 12 Apr 2018 22:51:20 +0200 Subject: Better game timing and better FPS/TPS display. --- src/common.hpp | 24 ++++++++++++++++++++--- src/game/game.cpp | 14 +++++++------- src/game/interface.cpp | 11 +---------- src/main.cpp | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/render.cpp | 2 ++ 5 files changed, 83 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/common.hpp b/src/common.hpp index 1cd1921..bb95f0e 100644 --- a/src/common.hpp +++ b/src/common.hpp @@ -40,6 +40,27 @@ extern bool debug_AI; typedef uint64_t ntime_t; ntime_t nclock(void); +class freq_counter_t { + ntime_t *samples; + size_t num_samples, collected = 0; + ntime_t last_tick = 0; + + float last_ma; + ntime_t last_ma_time = 0; + + void push(ntime_t sample); + +public: + freq_counter_t(size_t num_samples_); + ~freq_counter_t(void); + + void tick(void); + float freq_ma(void); +}; + +extern freq_counter_t fc_render; +extern freq_counter_t fc_game; + namespace procgen { class prng_t { uint32_t state = 0; @@ -351,9 +372,6 @@ namespace interface { std::list log; - double perf_hist[10] = {0}; - size_t perf_hist_index = 0; - void start_following(void); void stop_following(void); diff --git a/src/game/game.cpp b/src/game/game.cpp index 2a944af..4cac4eb 100644 --- a/src/game/game.cpp +++ b/src/game/game.cpp @@ -288,11 +288,12 @@ void state_t::resume(void) paused = false; } -#define TIME_DELTA ((ntime_t)1000000000 / 60) +#define TIME_DELTA ((ntime_t)1000000000 / 100) +#define TIME_LIMIT ((ntime_t)1000000000 / 10) void state_t::tick(ntime_t time_) { - size_t target, frames_this_tick = 0; + size_t target; if (paused) return; @@ -315,13 +316,12 @@ void state_t::tick(ntime_t time_) frames++; frames_since_t0++; - frames_this_tick++; time += TIME_DELTA; - if (frames_this_tick == 3) { - t0 = time_; - frames_since_t0 = 0; - frames_behind++; + fc_game.tick(); + + if (nclock() - time_ > TIME_LIMIT) { + frames_behind += target - frames_since_t0; break; } } diff --git a/src/game/interface.cpp b/src/game/interface.cpp index b187d42..c6d5e19 100644 --- a/src/game/interface.cpp +++ b/src/game/interface.cpp @@ -332,7 +332,6 @@ void state_t::render_to(render::state_t *render) size_t w = window->getSize().x, h = window->getSize().y; v2f_t x; std::stringstream ss; - double fps; if (select.selecting) { sf::Color color; @@ -391,18 +390,10 @@ void state_t::render_to(render::state_t *render) ss << render->stats.entities; render->render_text(x, em, ss.str(), render::ALIGN_LEFT_TOP, sf::Color::White); - perf_hist_index = (perf_hist_index + 1) % COUNT(perf_hist); - perf_hist[perf_hist_index] = 1.0 / render->dt; - - fps = 0.0; - for (size_t i = 0; i < COUNT(perf_hist); i++) - fps += perf_hist[i]; - fps /= COUNT(perf_hist); - x[1] += em; ss.str(std::string()); ss << std::fixed << std::setprecision(1); - ss << "FPS: " << fps; + ss << "FPS: " << fc_render.freq_ma() << ", " << fc_game.freq_ma() << " Hz"; render->render_text(x, em, ss.str(), render::ALIGN_LEFT_TOP, sf::Color::White); x[1] += em; diff --git a/src/main.cpp b/src/main.cpp index 9af2736..1e43d76 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -33,6 +33,58 @@ ntime_t nclock(void) std::chrono::nanoseconds(1) - nclock_ref; } +freq_counter_t::freq_counter_t(size_t num_samples_) +{ + num_samples = num_samples_; + samples = (ntime_t*)malloc(sizeof(ntime_t) * num_samples); +} + +freq_counter_t::~freq_counter_t(void) +{ + free(samples); +} + +void freq_counter_t::push(ntime_t sample) +{ + collected++; + samples[collected % num_samples] = sample; +} + +void freq_counter_t::tick(void) +{ + ntime_t now = nclock(); + + if (last_tick) + push(now - last_tick); + + last_tick = now; +} + +float freq_counter_t::freq_ma(void) +{ + ntime_t now; + float res = 0.0f; + size_t to_count; + + now = nclock(); + + if (last_ma_time && now - last_ma_time < 500000000) + return last_ma; + + to_count = std::min(collected, num_samples); + + for (size_t i = 0; i < to_count; i++) + res += samples[i] * 1.0e-9f; + res = 1.0f / (res / to_count); + + last_ma_time = now; + last_ma = res; + return res; +} + +freq_counter_t fc_render = freq_counter_t(20); +freq_counter_t fc_game = freq_counter_t(10); + int main() { nclock_ref = nclock() - 1; diff --git a/src/render.cpp b/src/render.cpp index 9056d9c..88ad25f 100644 --- a/src/render.cpp +++ b/src/render.cpp @@ -317,6 +317,8 @@ void state_t::render(game::state_t *game) if (debug_draw_cmodels) drender_entity(ent); } + + fc_render.tick(); } void state_t::render(double phase, animated_texture_t *anim, rectf_t bounds, sf::Color color, bool mirror){ -- cgit