我需要创建一个服务器端游戏循环,问题是如何限制循环 cpu 使用。
根据我的编程经验,繁忙的循环总是尽可能地占用最大的 CPU 使用率。但是我正在阅读SDL(Simple DirectMedia Layer)的代码,它有一个函数SDL_Delay(UINT32 ms)
,它有一个while循环,它是否占用最大cpu使用率,如果不是,为什么?
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));
最佳答案
此代码使用 select
超时。 select
通常接受一个文件描述符,并让调用者等待直到 fd 上发生 IO 事件。它还需要一个超时参数来表示等待的最长时间。这里fd为0,所以不会发生任何事件,函数会一直在超时时返回。
您从 C 库中获得的 select(3)
是 select(2)
系统调用的包装器,这意味着调用 select(3 )
最终让你进入内核。然后内核不会调度进程,除非发生 IO 事件或达到超时。因此进程在等待时不使用 CPU。
显然,跳入内核和进程调度会引入延迟。因此,如果您必须有非常低的延迟(纳秒),您应该使用忙等待。
关于c++ - while 循环是否总是占用全部 CPU 资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8692405/