|
Banjo API 1.0.0-rc.2
Low-level C99 game development API
|
Data Structures | |
| struct | bj_stopwatch |
Functions | |
| uint64_t | bj_get_time (void) |
| void | bj_sleep (int milliseconds) |
| double | bj_run_time (void) |
| uint64_t | bj_time_counter (void) |
| uint64_t | bj_time_frequency (void) |
| void | bj_reset_stopwatch (struct bj_stopwatch *stopwatch) |
| void | bj_step_stopwatch (struct bj_stopwatch *stopwatch) |
| double | bj_stopwatch_elapsed (const struct bj_stopwatch *stopwatch) |
| double | bj_stopwatch_delay (const struct bj_stopwatch *stopwatch) |
| double | bj_step_delay_stopwatch (struct bj_stopwatch *stopwatch) |
Three kinds of time: what time is it, how long since X, and please pause for a bit.
Programs need to talk about time in three different ways, and Banjo gives you a small helper for each.
"What time is it now?": bj_get_time returns the number of seconds since 1970-01-01 (the so-called Unix epoch). This is fine for stamping log lines or saving "last opened" timestamps, but it can jump backwards (e.g. if the user adjusts their system clock) and so it's not the right tool for measuring intervals.
"How long since X?": for that, use a monotonic counter that only ever moves forward. Two options:
For the very common pattern "how much time elapsed since I last asked?" (what game programmers call delta time) Banjo gives you bj_stopwatch. It's a tiny struct that remembers two timestamps: the reset point and the last step. Call bj_step_delay_stopwatch once per frame and it returns the seconds since the previous call and updates its internal "last step" timestamp in one go:
This dt is what your physics and animation code should multiply velocities by, that way the game runs at the same speed whether each frame takes 1 ms or 30 ms. The pong.c capstone tutorial walks through this pattern.
"Please pause for a bit": bj_sleep takes a number of milliseconds and returns when at least that much real time has passed. The "at least" matters: the OS may sleep you longer than requested. Don't use bj_sleep to precisely pace a frame rate (you'll get jitter); use it to yield the CPU between frames of an otherwise-tight loop so you stop pegging a core for no reason.
stopwatch.c and time.c for runnable demos. | struct bj_stopwatch |
Structure representing a simple stopwatch.
A stopwatch records the time it was last reset and the time of the last step. It computes elapsed time since reset, and delay since the last step. A zero-initialised stopwatch is valid and will auto-reset on first use.
| Data Fields | ||
|---|---|---|
| uint64_t | last_tick | Time of last step/checkpoint. |
| uint64_t | start_counter | Time when stopwatch was last reset. |
| uint64_t bj_get_time | ( | void | ) |
| void bj_reset_stopwatch | ( | struct bj_stopwatch * | stopwatch | ) |
Resets the stopwatch to the current time.
Records the current time as both the reset point and last step. Clears any prior timing information.
| stopwatch | Pointer to the stopwatch. |
| double bj_run_time | ( | void | ) |
Gets the current time in seconds since Banjo initialisation.
This function returns the time in seconds since bj_begin was called. It is suitable for general-purpose timing, but not for high-resolution use.
| void bj_sleep | ( | int | milliseconds | ) |
Suspends the current thread for a specified duration.
This function puts the current thread to sleep for at least the specified number of milliseconds. The actual sleep duration may be longer depending on the system.
| milliseconds | Number of milliseconds to sleep. |
Referenced by main().
| double bj_step_delay_stopwatch | ( | struct bj_stopwatch * | stopwatch | ) |
Steps the stopwatch and returns the delay since the previous step.
Equivalent to calling bj_stopwatch_delay followed by bj_step_stopwatch, but more efficient and concise.
| stopwatch | Pointer to the stopwatch. |
Referenced by step().
| void bj_step_stopwatch | ( | struct bj_stopwatch * | stopwatch | ) |
Records a step/checkpoint in time.
Updates the internal step timestamp. This does not affect the reset time, but is used to measure time deltas via bj_stopwatch_delay or bj_step_delay_stopwatch.
| stopwatch | Pointer to the stopwatch. |
Referenced by main().
| double bj_stopwatch_delay | ( | const struct bj_stopwatch * | stopwatch | ) |
Returns the time in seconds since the last step.
If the stopwatch has never been used, it will be reset automatically on first use. This function does not modify the stopwatch state.
| stopwatch | Pointer to the stopwatch. |
Referenced by main().
| double bj_stopwatch_elapsed | ( | const struct bj_stopwatch * | stopwatch | ) |
Returns the elapsed time in seconds since the stopwatch was reset.
If the stopwatch has never been explicitly reset, it will be reset automatically on first use.
| stopwatch | Pointer to the stopwatch. |
Referenced by main().
| uint64_t bj_time_counter | ( | void | ) |
Returns the current high-resolution time counter.
This value is in platform-dependent ticks and is suitable for precise timing and performance measurements. To convert ticks to seconds, divide by the result of bj_time_frequency.
| uint64_t bj_time_frequency | ( | void | ) |
Returns the frequency of the high-resolution counter.
This is the number of ticks per second returned by bj_time_counter. Use this to convert tick counts to seconds.