Necesito crear un bucle de juego del lado del servidor, el problema es cómo limitar el uso de la CPU de bucle.¿while loop siempre toma el uso completo de la CPU?
En mi experiencia de programación, un ciclo ocupado siempre toma el uso máximo de CPU que podría. Pero estoy leyendo el código de SDL (Simple DirectMedia Layer), tiene una función SDL_Delay(UINT32 ms)
, y tiene un ciclo while, ¿necesita el máximo uso de la CPU ?, si no es así, ¿por qué?
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));
Si un syscall 'select' recibe una señal, devuelve -1 con' errno == EINTR', por lo que no es cierto que 'select' siempre duerma el tiempo solicitado. –
Bien, mi error. ¿Alguna idea de por qué el manual de GNU recomienda seleccionar sobre dormir en este caso? –
Porque en algunos sistemas Unix antiguos (no Linux) 'sleep' se implementó con' SIGALRM' y 'pause' –