#include "SDL_FPSCounter.h" #include #include 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; }