Very basic utility to lock the execution rate of a function to a specific frameratei using polling. It is dependency free (even from the standard library) which makes it very portable. It does not perform any memory allocation.
Include the header file in every file you want to use it.
#include "frametimer.h"
In ONE file, define FRAMETIMER_IMPL
before including the header file.
#define FRAMETIMER_IMPL
#include "frametimer.h"
Define a function and allocate a frametimer
void print_delta(unsigned int dt) {
printf("Delta time is %d\n", dt);
}
frametimer_t ft_print_delta = {
.fps = 1,
.func = print_delta
};
Then in your update loop call ft_update
and give it the current time using the
method of your choice. This is platform dependant, the only constraint is that
time must be expressed in milliseconds.
while (true) {
unsigned int time = get_time()
int ran = ft_update(&ft_print_delta, time);
}
The function print_delta
will be executed once per second. ran
will be 1
if print_delta
executed, and 0
if it did not. This can be useful to skip
some other actions based on whether or not its dependencies executed.
typedef void (*ft_func_t)(unsigned int dt);
The function you want to bind to a frametimer_t
should be of this shape.
It takes an unsigned int
as an argument which will be the delta between this
execution and the previous one, and returns void
.
typedef struct {
ft_func_t func;
unsigned int fps;
unsigned int last_run;
unsigned int run_count;
} frametimer_t;
A frametimer_t
is a simple struct that stores the pointer to the function to
be executed, the framerate at which it should be executed, the timestamp of the
last run, and the number of time the function has been called since the start of
the program.
int ft_update(frametimer_t* ft, unsigned int time);
Calls the function bound to ft
if the delta between time
and its last
execution matches the framerate specified.