fix: examples should now have correct game loop structure with accumulator
This commit is contained in:
+9
-15
@@ -5,7 +5,6 @@
|
|||||||
#include "skele.h"
|
#include "skele.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stk/stk.h>
|
#include <stk/stk.h>
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
static uint8_t running = 1;
|
static uint8_t running = 1;
|
||||||
|
|
||||||
@@ -14,12 +13,8 @@ static void on_signal(void) { running = 0; }
|
|||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
skele_video_config_t video_cfg;
|
skele_video_config_t video_cfg;
|
||||||
uint64_t last, now, elapsed;
|
uint64_t last, now, elapsed, accum = 0;
|
||||||
uint8_t *pixels;
|
uint8_t *pixels;
|
||||||
uint32_t total;
|
|
||||||
|
|
||||||
(void)argc;
|
|
||||||
(void)argv;
|
|
||||||
|
|
||||||
skele_clock_init(on_signal);
|
skele_clock_init(on_signal);
|
||||||
|
|
||||||
@@ -43,8 +38,8 @@ int main(int argc, char *argv[])
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
total = (uint32_t)(video_cfg.render_width * video_cfg.render_height);
|
pixels = calloc(video_cfg.render_width * video_cfg.render_height,
|
||||||
pixels = malloc(total);
|
sizeof(uint8_t));
|
||||||
if (!pixels) {
|
if (!pixels) {
|
||||||
skele_video_shutdown();
|
skele_video_shutdown();
|
||||||
skele_stk_teardown();
|
skele_stk_teardown();
|
||||||
@@ -52,22 +47,21 @@ int main(int argc, char *argv[])
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(pixels, 0, total);
|
|
||||||
|
|
||||||
last = skele_time_ns();
|
last = skele_time_ns();
|
||||||
|
|
||||||
while (running) {
|
while (running) {
|
||||||
|
stk_poll();
|
||||||
if (!skele_input_poll())
|
if (!skele_input_poll())
|
||||||
break;
|
break;
|
||||||
|
|
||||||
stk_poll();
|
|
||||||
|
|
||||||
now = skele_time_ns();
|
now = skele_time_ns();
|
||||||
elapsed = now - last;
|
elapsed = now - last;
|
||||||
|
accum += elapsed;
|
||||||
if (elapsed >= skele_tick_ns) {
|
|
||||||
skele_tick();
|
|
||||||
last = now;
|
last = now;
|
||||||
|
|
||||||
|
while (accum >= skele_tick_ns) {
|
||||||
|
skele_tick();
|
||||||
|
accum -= skele_tick_ns;
|
||||||
}
|
}
|
||||||
|
|
||||||
skele_video_blit(pixels);
|
skele_video_blit(pixels);
|
||||||
|
|||||||
@@ -13,9 +13,7 @@ static void on_signal(void) { running = 0; }
|
|||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
skele_video_config_t video_cfg;
|
skele_video_config_t video_cfg;
|
||||||
uint64_t last;
|
uint64_t last, now, elapsed, accum = 0;
|
||||||
uint64_t now;
|
|
||||||
uint64_t elapsed;
|
|
||||||
|
|
||||||
skele_clock_init(on_signal);
|
skele_clock_init(on_signal);
|
||||||
|
|
||||||
@@ -49,10 +47,12 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
now = skele_time_ns();
|
now = skele_time_ns();
|
||||||
elapsed = now - last;
|
elapsed = now - last;
|
||||||
|
accum += elapsed;
|
||||||
if (elapsed >= skele_tick_ns) {
|
|
||||||
skele_tick();
|
|
||||||
last = now;
|
last = now;
|
||||||
|
|
||||||
|
while (accum >= skele_tick_ns) {
|
||||||
|
skele_tick();
|
||||||
|
accum -= skele_tick_ns;
|
||||||
}
|
}
|
||||||
|
|
||||||
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
||||||
|
|||||||
Reference in New Issue
Block a user