From: Antonio Ospite Date: Fri, 22 Mar 2013 13:09:04 +0000 (+0100) Subject: Initial import X-Git-Url: https://git.ao2.it/experiments/fps-meter.git/commitdiff_plain/94acc6420c71fa3bbc662abd05976dd19f7da792 Initial import --- 94acc6420c71fa3bbc662abd05976dd19f7da792 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..788550c --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.o +fps-meter diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..433b061 --- /dev/null +++ b/Makefile @@ -0,0 +1,41 @@ +CFLAGS = -std=c99 -pedantic -pedantic-errors -Wall -g3 -O2 -D_ANSI_SOURCE_ +CFLAGS += -fno-common \ + -Wall \ + -Wdeclaration-after-statement \ + -Wextra \ + -Wformat=2 \ + -Winit-self \ + -Winline \ + -Wpacked \ + -Wp,-D_FORTIFY_SOURCE=2 \ + -Wpointer-arith \ + -Wlarger-than-65500 \ + -Wmissing-declarations \ + -Wmissing-format-attribute \ + -Wmissing-noreturn \ + -Wmissing-prototypes \ + -Wnested-externs \ + -Wold-style-definition \ + -Wredundant-decls \ + -Wsign-compare \ + -Wstrict-aliasing=2 \ + -Wstrict-prototypes \ + -Wswitch-enum \ + -Wundef \ + -Wunreachable-code \ + -Wunsafe-loop-optimizations \ + -Wunused-but-set-variable \ + -Wwrite-strings + +#CFLAGS += -DDEBUG + +# For clock_nanosleep() +CFLAGS += -D_POSIX_C_SOURCE=200112L + +# for clock_gettime() +LDLIBS += -lrt + +fps-meter: fps-meter.o + +clean: + rm -rf *~ *.o fps-meter diff --git a/fps-meter.c b/fps-meter.c new file mode 100644 index 0000000..c66cb69 --- /dev/null +++ b/fps-meter.c @@ -0,0 +1,90 @@ +/* + * fps-meter - Example program about how to measure frames per seconds + * + * Copyright (C) 2013 Antonio Ospite + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#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) + +int main(void) +{ + struct timespec time_start; + struct timespec time_end; + struct timespec elapsed; + + struct timespec tmp; + + unsigned int frames = 0; + double nsecs = 0; + float fps; + + while (1) { + clock_gettime(CLOCK_MONOTONIC, &time_start); + dbg("Start time: s: %ld, ns: %ld", time_start.tv_sec, time_start.tv_nsec); + + /* simulate some workload of about 60fps */ + 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); + + clock_gettime(CLOCK_MONOTONIC, &time_end); + dbg("End time: s: %ld, ns: %ld", time_end.tv_sec, time_end.tv_nsec); + timespecsub(&time_end, &time_start, &elapsed); + dbg("Elapsed s: %ld ns: %ld", elapsed.tv_sec, elapsed.tv_nsec); + + frames++; + nsecs += (elapsed.tv_sec * NSEC_PER_SEC + elapsed.tv_nsec); + if (nsecs >= NSEC_PER_SEC) { + /* + * if each frame takes less than a second, then just + * printing 'frames' is enough, but if we want to + * cover the case when a frame may take more than + * a second, some calculations have to be done. + */ + fps = frames / (nsecs / NSEC_PER_SEC); + printf("(frames: %d, nsecs: %f) FPS: %.2f\n", frames, nsecs, fps); + nsecs = 0; + frames = 0; + } + } + + return 0; +}