Browse code

Tighter run

Devine Lu Linvega authored on 26/01/2023 18:56:14
Showing 1 changed files
... ...
@@ -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