Ho bisogno di creare un loop di gioco lato server, il problema è come limitare l'utilizzo della CPU in loop.fa il ciclo mentre prende sempre l'uso completo della CPU?
Nella mia esperienza di programmazione, un ciclo occupato utilizza sempre il massimo utilizzo della CPU. Ma sto leggendo il codice di SDL (Simple DirectMedia Layer), ha una funzione SDL_Delay(UINT32 ms)
, e ha un ciclo while, ci vuole massimo utilizzo della CPU, se no, perché?
https://github.com/eddieringle/SDL/blob/master/src/timer/unix/SDL_systimer.c#L137-158
do {
errno = 0;
#if HAVE_NANOSLEEP
tv.tv_sec = elapsed.tv_sec;
tv.tv_nsec = elapsed.tv_nsec;
was_error = nanosleep(&tv, &elapsed);
#else
/* Calculate the time interval left (in case of interrupt) */
now = SDL_GetTicks();
elapsed = (now - then);
then = now;
if (elapsed >= ms) {
break;
}
ms -= elapsed;
tv.tv_sec = ms/1000;
tv.tv_usec = (ms % 1000) * 1000;
was_error = select(0, NULL, NULL, NULL, &tv);
#endif /* HAVE_NANOSLEEP */
} while (was_error && (errno == EINTR));
Se un syscall 'select' riceve un segnale, restituisce -1 con' errno == EINTR' quindi non è vero che 'select' sempre dorme il tempo richiesto. –
OK, mio errore. Qualche idea sul perché il manuale GNU raccomanda di selezionare su sleep in questo caso? –
Perché su alcuni vecchi sistemi Unix (non Linux) 'sleep' è stato implementato con' SIGALRM' e 'pause' –