...
|
...
|
@@ -432,28 +432,20 @@ handle_events(Uxn *u)
|
432
|
432
|
static int
|
433
|
433
|
run(Uxn *u)
|
434
|
434
|
{
|
435
|
|
- Uint64 now = SDL_GetPerformanceCounter(), frame_end, frame_interval = SDL_GetPerformanceFrequency() / 60;
|
436
|
|
- for(;;) {
|
437
|
|
- /* .System/halt */
|
438
|
|
- if(u->dev[0x0f])
|
439
|
|
- return error("Run", "Ended.");
|
440
|
|
- frame_end = now + frame_interval;
|
|
435
|
+ Uint64 now = SDL_GetPerformanceCounter(), frame_end = now, frame_interval = SDL_GetPerformanceFrequency() / 60;
|
|
436
|
+ for(;!u->dev[0x0f]; now = SDL_GetPerformanceCounter()) {
|
441
|
437
|
exec_deadline = now + deadline_interval;
|
442
|
438
|
if(!handle_events(u))
|
443
|
439
|
return 0;
|
444
|
|
- uxn_eval(u, GETVEC(&u->dev[0x20]));
|
|
440
|
+ if (((Sint64)(frame_end - SDL_GetPerformanceCounter())) >= 0) {
|
|
441
|
+ frame_end = now + frame_interval;
|
|
442
|
+ uxn_eval(u, GETVEC(&u->dev[0x20]));
|
|
443
|
+ }
|
445
|
444
|
if(uxn_screen.fg.changed || uxn_screen.bg.changed)
|
446
|
445
|
redraw();
|
447
|
|
- now = SDL_GetPerformanceCounter();
|
448
|
|
- if(u->dev[0x20]) {
|
449
|
|
- if(!BENCH && ((Sint64)(frame_end - now)) > 0) {
|
450
|
|
- SDL_Delay((frame_end - now) / ms_interval);
|
451
|
|
- now = frame_end;
|
452
|
|
- }
|
453
|
|
- } else
|
454
|
|
- SDL_WaitEvent(NULL);
|
|
446
|
+ SDL_WaitEventTimeout(NULL, GETVEC(&u->dev[0x20]) ? (frame_end - SDL_GetPerformanceCounter()) / ms_interval : 0x100000);
|
455
|
447
|
}
|
456
|
|
- return error("SDL_WaitEvent", SDL_GetError());
|
|
448
|
+ return error("Run", "Ended.");
|
457
|
449
|
}
|
458
|
450
|
|
459
|
451
|
int
|