2

我想创建一个简单的 2D 游戏。我不想使用线程。编程语言将是 Java(但可以是任何语言,并不重要......)。

while(true)...如果我使用像(无限循环)这样的主循环,是否可以避免高 CPU 使用率?

4

3 回答 3

4

在游戏中,您通常有一个运行所有内容的主循环。但是,为了避免做不必要的事情,通常只以一定的帧速率(例如每秒 60 帧 (FPS))更新游戏。

大多数游戏通过使 CPU 休眠直到需要计算/绘制新帧来实现这一点。在 python 游戏库 pygame 中,这是使用pygame.time.wait完成的:

将暂停给定的毫秒数。此函数使进程休眠以与其他程序共享处理器。等待几毫秒的程序将消耗很少的处理器时间。

于 2012-05-01T23:01:35.910 回答
1

为了说明 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 毫秒,上面的循环就会中断,所以我们有特殊的代码来检测它并赶上或丢帧,但这是基本思想。此外,直到最近,我们实际上并没有使用浮点数来表示时间,而是使用定点微秒计数器。

于 2012-05-01T23:32:19.080 回答
0

您所要做的就是“阻止输入”......并且您的CPU 使用率为零。无论如何,直到有事情发生。

几乎任何套接字程序都会有一个类似这样的循环:

  while (true) {
    select ()
    ...

您可以轻松地等待“ getchar()”或“ WaitOnSingleEvent()

有人可能会争辩说,“阻塞 I/O”实际上是一种最佳设计策略。它击败了替代方案 - “轮询”(轮询是邪恶的)。

恕我直言..

于 2012-05-01T22:57:33.653 回答