| ... | ... |
@@ -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 |