diff -r 18de2af03531 -r d3285aed65b3 src/context.c --- a/src/context.c Thu Mar 28 23:30:21 2024 +0100 +++ b/src/context.c Fri Mar 29 00:03:25 2024 +0100 @@ -33,8 +33,16 @@ #include #include +#include + AscContext asc_context; +static uint64_t asc_nanos(void) { + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return 1000000000ull*(uint64_t)ts.tv_sec + (uint64_t)ts.tv_nsec; +} + void asc_context_initialize(void) { if (asc_test_flag(asc_context.flags, ASC_FLAG_INITILIZED)) return; @@ -58,6 +66,7 @@ } } SDL_ClearError(); + asc_context.total_nanos = asc_nanos(); asc_set_flag(&asc_context.flags, ASC_FLAG_INITILIZED); asc_dprintf("Ascension context initialized."); } @@ -128,11 +137,13 @@ } // compute frame time - static Uint32 ticks; - Uint32 ticks_elapsed = SDL_GetTicks() - ticks; - ticks = SDL_GetTicks(); - asc_context.elapsed_millis = ticks_elapsed; - asc_context.elapsed = (float) ticks_elapsed / 1000.0f; + uint64_t frame_nanos, ns; + do { + ns = asc_nanos(); + frame_nanos = ns - asc_context.total_nanos; + } while (frame_nanos == 0); + asc_context.frame_nanos = frame_nanos; + asc_context.total_nanos = ns; return !asc_test_flag(asc_context.flags, ASC_FLAG_QUIT); }