我想创建一个简单的 2D 游戏。我不想使用线程。编程语言将是 Java(但可以是任何语言,并不重要......)。
while(true)...
如果我使用像(无限循环)这样的主循环,是否可以避免高 CPU 使用率?
我想创建一个简单的 2D 游戏。我不想使用线程。编程语言将是 Java(但可以是任何语言,并不重要......)。
while(true)...
如果我使用像(无限循环)这样的主循环,是否可以避免高 CPU 使用率?
在游戏中,您通常有一个运行所有内容的主循环。但是,为了避免做不必要的事情,通常只以一定的帧速率(例如每秒 60 帧 (FPS))更新游戏。
大多数游戏通过使 CPU 休眠直到需要计算/绘制新帧来实现这一点。在 python 游戏库 pygame 中,这是使用pygame.time.wait完成的:
将暂停给定的毫秒数。此函数使进程休眠以与其他程序共享处理器。等待几毫秒的程序将消耗很少的处理器时间。
为了说明 Darthfett 的回答,主机游戏的主循环通常如下所示:
#define FRAMELENGTH (1.0 / 60.0) // 60hz = 16.6ms per NTSC frame. Different for PAL.
while ( !QuitSignalled() )
{
double frameStartTime = GetTime(); // imagine microsecond precision
HandleUserInput( PollController() );
SimulateEntities();
Physics();
Render();
Sound();
etc();
double timeUntilNextFrameShouldStart = GetTime() - frameStartTime + FRAMELENGTH;
sleep( timeUntilNextFrameShouldStart );
}
// if down here, we got the 'quit' signal
ExitToDesktop();
当然,如果一个帧的执行时间超过 16.6 毫秒,上面的循环就会中断,所以我们有特殊的代码来检测它并赶上或丢帧,但这是基本思想。此外,直到最近,我们实际上并没有使用浮点数来表示时间,而是使用定点微秒计数器。
您所要做的就是“阻止输入”......并且您的CPU 使用率为零。无论如何,直到有事情发生。
几乎任何套接字程序都会有一个类似这样的循环:
while (true) {
select ()
...
您可以轻松地等待“ getchar()
”或“ WaitOnSingleEvent()
”
有人可能会争辩说,“阻塞 I/O”实际上是一种最佳设计策略。它击败了替代方案 - “轮询”(轮询是邪恶的)。
恕我直言..