ref: a5d7c6f7104a6f4beaa653f24794dcd79a425110
parent: 846ce9d9cad4b46246ea18f3def3112a7e49b802
author: Olav Sørensen <olav.sorensen@live.no>
date: Thu Jul 7 20:38:54 EDT 2022
Fix FPS counter (CTRL+SHIFT+F)
--- a/src/ft2_hpc.c
+++ b/src/ft2_hpc.c
@@ -34,7 +34,7 @@
// 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 @@
#endif
hpcFreq.freq64 = SDL_GetPerformanceFrequency();
hpcFreq.dFreq = (double)hpcFreq.freq64;
+ hpcFreq.dFreqMulMs = 1000.0 / hpcFreq.dFreq;
hpcFreq.dFreqMulMicro = (1000.0 * 1000.0) / hpcFreq.dFreq;
}
--- 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
--- a/src/ft2_video.c
+++ b/src/ft2_video.c
@@ -59,7 +59,7 @@
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 @@
{
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 @@
{
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 @@
// 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 @@
{
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);
}
}