Fix sleep timing
This commit is contained in:
parent
addff55c24
commit
9f955be5dc
12
game.c
12
game.c
|
@ -6,10 +6,16 @@
|
||||||
|
|
||||||
int sleepNanos(long int ns) {
|
int sleepNanos(long int ns) {
|
||||||
struct timespec time;
|
struct timespec time;
|
||||||
|
if (ns < 0) return 0;
|
||||||
time.tv_sec = ns / 1000000000;
|
time.tv_sec = ns / 1000000000;
|
||||||
time.tv_nsec = ns % 1000000000;
|
time.tv_nsec = ns % 1000000000;
|
||||||
return nanosleep(&time, NULL);
|
return nanosleep(&time, NULL);
|
||||||
}
|
}
|
||||||
|
long int tickNs() {
|
||||||
|
struct timespec time;
|
||||||
|
clock_gettime(CLOCK_MONOTONIC, &time);
|
||||||
|
return (time.tv_sec * 1000000000) + time.tv_nsec;
|
||||||
|
}
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
GraphicsContext *gfx;
|
GraphicsContext *gfx;
|
||||||
|
@ -46,17 +52,17 @@ int runGame(VB *sim, GraphicsContext *gfx) {
|
||||||
gfxUpdateLeftEye(gfx, LEFT_EYE_DEFAULT);
|
gfxUpdateLeftEye(gfx, LEFT_EYE_DEFAULT);
|
||||||
gfxUpdateRightEye(gfx, RIGHT_EYE_DEFAULT);
|
gfxUpdateRightEye(gfx, RIGHT_EYE_DEFAULT);
|
||||||
|
|
||||||
prevTicks = SDL_GetTicks64();
|
|
||||||
while (1) {
|
while (1) {
|
||||||
clocks = MAX_STEP_CLOCKS;
|
clocks = MAX_STEP_CLOCKS;
|
||||||
|
prevTicks = tickNs();
|
||||||
vbEmulate(sim, &clocks);
|
vbEmulate(sim, &clocks);
|
||||||
ticks = SDL_GetTicks64();
|
ticks = tickNs();
|
||||||
while (SDL_PollEvent(&event)) {
|
while (SDL_PollEvent(&event)) {
|
||||||
if (event.type == SDL_QUIT) {
|
if (event.type == SDL_QUIT) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sleepNanos(((MAX_STEP_CLOCKS - clocks) * 50) - (ticks - prevTicks) * 1000);
|
sleepNanos(((MAX_STEP_CLOCKS - clocks) * 50) - (ticks - prevTicks));
|
||||||
prevTicks = ticks;
|
prevTicks = ticks;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue