ft2-clone

Fasttracker 2 clone
Log | Files | Refs | README | LICENSE

commit a5d7c6f7104a6f4beaa653f24794dcd79a425110
parent 846ce9d9cad4b46246ea18f3def3112a7e49b802
Author: Olav Sørensen <olav.sorensen@live.no>
Date:   Fri,  8 Jul 2022 00:38:27 +0200

Fix FPS counter (CTRL+SHIFT+F)

Diffstat:
Msrc/ft2_hpc.c | 3++-
Msrc/ft2_hpc.h | 2+-
Msrc/ft2_video.c | 19++++++++++---------
3 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/src/ft2_hpc.c b/src/ft2_hpc.c @@ -34,7 +34,7 @@ static void usleepGood(int32_t usec) // NtDelayExecution() delays in 100ns-units, and negative value = delay from current time usec *= -10; - delayInterval.HighPart = 0xFFFFFFFF; + delayInterval.HighPart = 0xFFFFFFFF; // negative 64-bit value, we only set the lower dword delayInterval.LowPart = usec; NtDelayExecution(false, &delayInterval); } @@ -61,6 +61,7 @@ void hpc_Init(void) #endif hpcFreq.freq64 = SDL_GetPerformanceFrequency(); hpcFreq.dFreq = (double)hpcFreq.freq64; + hpcFreq.dFreqMulMs = 1000.0 / hpcFreq.dFreq; hpcFreq.dFreqMulMicro = (1000.0 * 1000.0) / hpcFreq.dFreq; } diff --git a/src/ft2_hpc.h b/src/ft2_hpc.h @@ -6,7 +6,7 @@ typedef struct { uint64_t freq64; - double dFreq, dFreqMulMicro; + double dFreq, dFreqMulMicro, dFreqMulMs; } hpcFreq_t; typedef struct diff --git a/src/ft2_video.c b/src/ft2_video.c @@ -59,7 +59,7 @@ static sprite_t sprites[SPRITE_NUM]; static char fpsTextBuf[1024]; static uint64_t frameStartTime; -static double dRunningFPS, dFrameTime, dAvgFPS; +static double dRunningFrameDuration, dAvgFPS; // ------------------ static void drawReplayerData(void); @@ -68,8 +68,7 @@ void resetFPSCounter(void) { editor.framesPassed = 0; fpsTextBuf[0] = '\0'; - dRunningFPS = VBLANK_HZ; - dFrameTime = 1000.0 / VBLANK_HZ; + dRunningFrameDuration = 1000.0 / VBLANK_HZ; } void beginFPSCounter(void) @@ -82,11 +81,11 @@ static void drawFPSCounter(void) { if (editor.framesPassed >= FPS_SCAN_FRAMES && (editor.framesPassed % FPS_SCAN_FRAMES) == 0) { - dAvgFPS = dRunningFPS * (1.0 / FPS_SCAN_FRAMES); + dAvgFPS = 1000.0 / (dRunningFrameDuration / FPS_SCAN_FRAMES); if (dAvgFPS < 0.0 || dAvgFPS > 99999999.9999) dAvgFPS = 99999999.9999; // prevent number from overflowing text box - dRunningFPS = 0.0; + dRunningFrameDuration = 0.0; } clearRect(FPS_RENDER_X+2, FPS_RENDER_Y+2, FPS_RENDER_W, FPS_RENDER_H); @@ -98,7 +97,7 @@ static void drawFPSCounter(void) // test if enough data is collected yet if (editor.framesPassed < FPS_SCAN_FRAMES) { - textOut(FPS_RENDER_X+53, FPS_RENDER_Y+39, PAL_FORGRND, "Collecting frame information..."); + textOut(FPS_RENDER_X+53, FPS_RENDER_Y+39, PAL_FORGRND, "Gathering frame information..."); return; } @@ -150,9 +149,11 @@ void endFPSCounter(void) { if (video.showFPSCounter && frameStartTime > 0) { - const uint64_t frameTimeDiff = SDL_GetPerformanceCounter() - frameStartTime; - const double dHz = 1000.0 / (frameTimeDiff * editor.dPerfFreqMulMs); - dRunningFPS += dHz; + uint64_t frameTimeDiff64 = SDL_GetPerformanceCounter() - frameStartTime; + if (frameTimeDiff64 > INT32_MAX) + frameTimeDiff64 = INT32_MAX; + + dRunningFrameDuration += (int32_t)frameTimeDiff64 / (hpcFreq.dFreq / 1000.0); } }