From d4bb64d6f944713b46eabe7bbbed489ba8619acb Mon Sep 17 00:00:00 2001 From: outfrost Date: Sun, 6 Jan 2019 06:25:55 +0100 Subject: [PATCH] Add frametime & fps metering It runs at 2400 fps. My PC might need help later. --- Makefile | 5 ++++- main.c | 2 ++ performance.c | 42 ++++++++++++++++++++++++++++++++++++++++++ performance.h | 7 +++++++ render.c | 3 +++ 5 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 performance.c create mode 100644 performance.h diff --git a/Makefile b/Makefile index a296fac..0490851 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ libraries ::= -L/usr/local/lib -lGL -lglut -lassimp # Prefix all object file names with the compilation directory objects ::= $(addprefix out/, \ main.o debugutil.o glut_janitor.o render.o \ - tga.o level.o) + tga.o level.o performance.o) # Set executable extension for the platform ifeq ($(OS),Windows_NT) @@ -56,3 +56,6 @@ out/tga.o : tga.c tga.h | out out/level.o : level.c level.h tga.h | out $(CC) $(compileargs) -c -o out/level.o level.c + +out/performance.o : performance.c | out + $(CC) $(compileargs) -c -o out/performance.o performance.c diff --git a/main.c b/main.c index 22e6831..34d7ec6 100644 --- a/main.c +++ b/main.c @@ -4,6 +4,7 @@ #include "glut_janitor.h" #include "render.h" #include "level.h" +#include "performance.h" int main(int argc, char** argv) { glutInit(&argc, argv); @@ -22,6 +23,7 @@ int main(int argc, char** argv) { //glutMotionFunc(mouse_motion_event); initRender(); + initPerformanceMetering(); model = importModel("out/assets/wall01.3ds"); /* diff --git a/performance.c b/performance.c new file mode 100644 index 0000000..cb3709f --- /dev/null +++ b/performance.c @@ -0,0 +1,42 @@ +#include +#include // TODO remove +#include + +typedef struct timespec Timepoint; + +static Timepoint lastDisplayTime; +static int frames = 0; +static bool meteringEnabled = false; + +void initPerformanceMetering() { + if (clock_gettime(CLOCK_MONOTONIC, &lastDisplayTime) != 0) { + fprintf(stderr, "Clock read failed, performance metering unavailable\n"); + } + else { + meteringEnabled = true; + } +} + +void frameRendered() { + if (meteringEnabled) { + ++frames; + Timepoint now; + + if (clock_gettime(CLOCK_MONOTONIC, &now) != 0) { + fprintf(stderr, "Clock read failed, stopping performance metering\n"); + meteringEnabled = false; + return; + } + + time_t fullSeconds = now.tv_sec - lastDisplayTime.tv_sec; + if (now.tv_nsec < lastDisplayTime.tv_nsec) --fullSeconds; + + if (fullSeconds > 0) { + float seconds = (now.tv_nsec - lastDisplayTime.tv_nsec) / 1000000000.0f; + seconds += (float) (now.tv_sec - lastDisplayTime.tv_sec); + printf("frametime avg %.1f ms; fps avg %.f\n", (seconds / frames) * 1000.0f, (frames / seconds)); + lastDisplayTime = now; + frames = 0; + } + } +} diff --git a/performance.h b/performance.h new file mode 100644 index 0000000..b4ded6b --- /dev/null +++ b/performance.h @@ -0,0 +1,7 @@ +#ifndef PERFORMANCE_H_ +#define PERFORMANCE_H_ + +void initPerformanceMetering(); +void frameRendered(); + +#endif diff --git a/render.c b/render.c index 3e29339..a1f5a30 100644 --- a/render.c +++ b/render.c @@ -3,6 +3,7 @@ #include "render.h" #include "typedefs.h" +#include "performance.h" const float AXIS_RADIUS = 5.0f; @@ -15,6 +16,8 @@ void renderScene() { glFlush(); glutSwapBuffers(); + frameRendered(); + glutPostRedisplay(); } void drawAxes() { -- 2.44.0