X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fgame.c;h=37608e5d5152f84946ad85f2d1c5e92a344d5606;hp=3db4e1bc77d9d44717e3c7e1b913be7b625fbe07;hb=b40c5be44ed492da183f29d9f2f8184391c31cf0;hpb=3e37435df4c77706b5820abcbc4364d37618b645 diff --git a/src/game.c b/src/game.c index 3db4e1bc..37608e5d 100644 --- a/src/game.c +++ b/src/game.c @@ -4292,6 +4292,51 @@ static void PlayerActions(struct PlayerInfo *player, byte player_action) } } +static void sleep_milliseconds_x(unsigned long milliseconds_delay) +{ + boolean do_busy_waiting = (milliseconds_delay < 5 ? TRUE : FALSE); + +#if defined(PLATFORM_MSDOS) + /* don't use select() to perform waiting operations under DOS/Windows + environment; always use a busy loop for waiting instead */ + do_busy_waiting = TRUE; +#endif + + + + do_busy_waiting = TRUE; + + + + if (do_busy_waiting) + { + /* we want to wait only a few ms -- if we assume that we have a + kernel timer resolution of 10 ms, we would wait far to long; + therefore it's better to do a short interval of busy waiting + to get our sleeping time more accurate */ + + unsigned long base_counter = Counter(), actual_counter = Counter(); + + while (actual_counter < base_counter + milliseconds_delay && + actual_counter >= base_counter) + actual_counter = Counter(); + } + else + { +#if defined(TARGET_SDL) + SDL_Delay(milliseconds_delay); +#else + struct timeval delay; + + delay.tv_sec = milliseconds_delay / 1000; + delay.tv_usec = 1000 * (milliseconds_delay % 1000); + + if (select(0, NULL, NULL, NULL, &delay) != 0) + Error(ERR_WARN, "sleep_milliseconds(): select() failed"); +#endif + } +} + void GameActions() { static unsigned long action_delay = 0; @@ -4309,7 +4354,45 @@ void GameActions() /* ---------- main game synchronization point ---------- */ - WaitUntilDelayReached(&action_delay, action_delay_value); + + +#if 1 + WaitUntilDelayReached(&action_delay, action_delay_value); +#else + { + unsigned long count1 = SDL_GetTicks(), count2, current_ms, test; + + /* + WaitUntilDelayReached(&action_delay, action_delay_value); + */ + + /* + SDL_Delay(20); + */ + + /* + sleep_milliseconds_x(20); + */ + + current_ms = SDL_GetTicks(); + test = -1; + while (current_ms < count1 + 20) + { + current_ms = SDL_GetTicks(); /* busy wait! */ + + if (test != current_ms) + { + Error(ERR_RETURN, "current_ms == %ld", current_ms); + test = current_ms; + } + } + + count2 = SDL_GetTicks(); + Error(ERR_RETURN, "delay == %ld", count2 - count1); + } +#endif + + if (network_playing && !network_player_action_received) {