51 lines
1.3 KiB
C
51 lines
1.3 KiB
C
#include "SDL_FPSCounter.h"
|
|
|
|
#include <SDL3/SDL.h>
|
|
#include <stdlib.h>
|
|
|
|
int SDL_CreateFPSCounter(SDL_FPSCounter* counter, uint32_t window_length)
|
|
{
|
|
counter->window = malloc(sizeof(uint64_t) * window_length);
|
|
if (counter->window == NULL) {
|
|
SDL_OutOfMemory();
|
|
return -1;
|
|
}
|
|
memset(counter->window, 0, window_length * sizeof(uint64_t));
|
|
counter->frequency = SDL_GetPerformanceFrequency();
|
|
counter->window_index = 0;
|
|
counter->window_length = window_length;
|
|
|
|
return EXIT_SUCCESS;
|
|
}
|
|
|
|
void SDL_DestroyFPSCounter(SDL_FPSCounter* counter)
|
|
{
|
|
free(counter->window);
|
|
memset(counter, 0, sizeof *counter);
|
|
}
|
|
|
|
int SDL_FPSCounterTick(SDL_FPSCounter* counter)
|
|
{
|
|
counter->window[counter->window_index] = SDL_GetPerformanceCounter();
|
|
counter->window_index++;
|
|
counter->window_index = counter->window_index % counter->window_length;
|
|
|
|
return EXIT_SUCCESS;
|
|
}
|
|
|
|
uint64_t SDL_FPSCounterFPS(SDL_FPSCounter* counter)
|
|
{
|
|
uint64_t last = counter->window[counter->window_index];
|
|
uint64_t current;
|
|
uint64_t acc_difference = 0;
|
|
|
|
for (uint32_t i = (counter->window_index + 1) % counter->window_length; i != counter->window_index; i = (i + 1) % counter->window_length) {
|
|
current = counter->window[i];
|
|
acc_difference += current - last;
|
|
|
|
last = current;
|
|
}
|
|
|
|
uint64_t average_difference = acc_difference / (counter->window_length - 1);
|
|
return counter->frequency / average_difference;
|
|
}
|