From d62a2f793fdf10f677a2bf8a31a6734c9788a0dd Mon Sep 17 00:00:00 2001 From: Ray Date: Wed, 19 Feb 2020 12:20:15 +0100 Subject: [PATCH] Improved GetFPS() calculation for average --- src/core.c | 23 ++++++++++++++++++++++- src/text.c | 19 +------------------ 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/core.c b/src/core.c index 2c3141129..ecf2b2845 100644 --- a/src/core.c +++ b/src/core.c @@ -1611,9 +1611,30 @@ void SetTargetFPS(int fps) } // Returns current FPS +// NOTE: We calculate an average framerate int GetFPS(void) { - return (int)roundf(1.0f/GetFrameTime()); + #define FPS_CAPTURE_FRAMES_COUNT 30 // 30 captures + #define FPS_AVERAGE_TIME_SECONDS 0.5f // 500 millisecondes + #define FPS_STEP (FPS_AVERAGE_TIME_SECONDS/FPS_CAPTURE_FRAMES_COUNT) + + static int index = 0; + static float history[FPS_CAPTURE_FRAMES_COUNT] = { 0 }; + static float average = 0, last = 0; + float fpsFrame = GetFrameTime(); + + if (fpsFrame == 0) return 0; + + if ((GetTime() - last) > FPS_STEP) + { + last = GetTime(); + index = (index + 1)%FPS_CAPTURE_FRAMES_COUNT; + average -= history[index]; + history[index] = fpsFrame/FPS_CAPTURE_FRAMES_COUNT; + average += history[index]; + } + + return (int)roundf(1.0f/average); } // Returns time in seconds for last frame drawn diff --git a/src/text.c b/src/text.c index 074fcdb2b..d2562179b 100644 --- a/src/text.c +++ b/src/text.c @@ -768,24 +768,7 @@ void UnloadFont(Font font) // NOTE: Uses default font void DrawFPS(int posX, int posY) { - // NOTE: We are rendering fps every certain time for better viewing on high framerates - - static int fps = 0; - static int counter = 0; - static int refreshRate = 20; - - if (counter < refreshRate) counter++; - else - { - fps = GetFPS(); - refreshRate = fps; - counter = 0; - } - - // TODO: Find a better way to calculate FPS, maybe calculate the mean of multiple measures? - - // NOTE: We have rounding errors every frame, so it oscillates a lot - DrawText(TextFormat("%2i FPS", fps), posX, posY, 20, LIME); + DrawText(TextFormat("%2i FPS", GetFPS()), posX, posY, 20, LIME); } // Draw text (using default font)