X-Git-Url: https://git.ao2.it/experiments/fps-meter.git/blobdiff_plain/d73b9869570111a3249139508e43f3f722adad2e..refs/heads/master:/fps-meter.c?ds=sidebyside diff --git a/fps-meter.c b/fps-meter.c index 0de937e..2d9ea6b 100644 --- a/fps-meter.c +++ b/fps-meter.c @@ -17,78 +17,7 @@ * along with this program. If not, see . */ -#include -#include -#include - -#ifdef DEBUG -#define dbg(...) \ - do { \ - printf(__VA_ARGS__); \ - printf("\n"); \ - fflush(stdout); \ - } while(0) -#else -#define dbg(...) do {} while(0) -#endif - -#define NSEC_PER_SEC 1000000000 - -#define timespecsub(a, b, result) \ - do { \ - (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ - (result)->tv_nsec = (a)->tv_nsec - (b)->tv_nsec; \ - if ((result)->tv_nsec < 0) { \ - --(result)->tv_sec; \ - (result)->tv_nsec += 1000000000; \ - } \ - } while(0) - -struct fps_meter_stats { - struct timespec time_start; - struct timespec time_end; - struct timespec elapsed; - - unsigned int frames; - double nsecs; -}; - -static void fps_meter_init(struct fps_meter_stats *stats) -{ - memset(stats, 0, sizeof(*stats)); - - clock_gettime(CLOCK_MONOTONIC, &stats->time_start); - dbg("Init time: s: %ld, ns: %ld", stats->time_start.tv_sec, stats->time_start.tv_nsec); -} - -static void fps_meter_update(struct fps_meter_stats *stats) -{ - dbg("Start time: s: %ld, ns: %ld", stats->time_start.tv_sec, stats->time_start.tv_nsec); - - clock_gettime(CLOCK_MONOTONIC, &stats->time_end); - dbg("End time: s: %ld, ns: %ld", stats->time_end.tv_sec, stats->time_end.tv_nsec); - - timespecsub(&stats->time_end, &stats->time_start, &stats->elapsed); - dbg("Elapsed s: %ld ns: %ld", stats->elapsed.tv_sec, stats->elapsed.tv_nsec); - - stats->frames++; - stats->nsecs += (stats->elapsed.tv_sec * NSEC_PER_SEC + stats->elapsed.tv_nsec); - if (stats->nsecs >= NSEC_PER_SEC) { - /* - * if we were garanteed that each frame took less than - * a second, then just printing 'frames' would be enough here, - * but if we want to cover the case when a frame may take more - * than a second, some calculations have to be done. - */ - float fps = stats->frames / (stats->nsecs / NSEC_PER_SEC); - printf("(frames: %d, nsecs: %f) FPS: %.2f\n", stats->frames, stats->nsecs, fps); - stats->nsecs = 0; - stats->frames = 0; - } - - /* update the stats for the next iteration */ - clock_gettime(CLOCK_MONOTONIC, &stats->time_start); -} +#include "fps-meter.h" int main(void) { @@ -98,7 +27,7 @@ int main(void) fps_meter_init(&stats); while (1) { /* simulate some workload of about 60fps */ - dbg("Doing some work, which takes about %d ns", NSEC_PER_SEC / 60); + fps_meter_dbg("Doing some work, which takes about %d ns", NSEC_PER_SEC / 60); tmp.tv_sec = 0; tmp.tv_nsec = NSEC_PER_SEC / 60; clock_nanosleep(CLOCK_MONOTONIC, 0, &tmp, NULL);