Java 游戏编程-无限循环的CPU使用

Java 游戏编程-无限循环的CPU使用,java,software-design,2d-games,Java,Software Design,2d Games,我想创建一个简单的2D游戏。我不想使用线程。编程语言将是Java(但可以是任何语言,并不重要…) 如果我使用像while(true).(无限循环)这样的主循环,是否可以避免高CPU使用率?您所要做的就是“阻塞输入”。。。而且你的CPU使用率为零。除非发生什么事 几乎所有套接字程序都会有这样的循环: while (true) { select () ... 您可以轻松地等待“getchar()”,或“watonsingleEvent()” 有人可能会说“I/O阻塞”实际上是一

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

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

您所要做的就是“阻塞输入”。。。而且你的CPU使用率为零。除非发生什么事

几乎所有套接字程序都会有这样的循环:

  while (true) {
    select ()
    ...
您可以轻松地等待“
getchar()
”,或“
watonsingleEvent()

有人可能会说“I/O阻塞”实际上是一种最佳设计策略。它击败了另一种选择——“投票”(投票是邪恶的)


IMHO.

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

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

将暂停给定的毫秒数。此函数用于休眠进程,以便与其他程序共享处理器。一个只需等待几毫秒的程序将消耗很少的处理器时间


为了说明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.6ms,上面的循环就会中断,所以我们有专门的代码来检测它,并捕获或丢弃帧,但这是基本思想。此外,直到最近,我们才真正使用浮点数表示时间,而是使用定点微秒计数器。

请详细说明您的问题。这是目前无法回答的…游戏要用什么语言编写?如果你使用的是JavaScript或ActionScript,无限循环将杀死你的游戏。如果您使用的是XNA(C#),那么已经提供了一个游戏循环。我还没有找到一本关于2D游戏开发历史的好书,但是您可能对“经典游戏后期”感兴趣在游戏开发者会议室:许多老游戏的创作者在这些讲座中解释了他们的过程。现在你已经声明它将用java编写:你打算用swing来绘制游戏吗?twall:是的,我在用swing。你认为Swing对Java游戏有好处吗?这个答案是在语言不可知的时候写的。大多数其他语言都有等价物,包括Java。是的,我不打算在问题中包括语言,因为我知道几乎所有语言都有这种资源+1@tecnotron您是否有语言偏好,或者您的问题是非常笼统的?如果是后者,这是你能得到的最接近答案。这是一个一般性的问题。编程语言并不重要。I/O阻塞在游戏中并不流行,因为无论输入是否输入,渲染都需要在恒定的60hz下运行。如果主循环等待I/O,则您可能会遇到帧的时间步长不同的情况(因此无法使用常数Δt运行模拟/AI/物理/声音),或者更糟的是,渲染暂停很长时间,等待按键。通常情况下,在游戏中,I/O轮询正是我们所做的——无论发生什么情况,游戏每秒运行60帧,每一帧我们都会查看控制器。有时每帧不止一次。如果我“阻塞输入”,循环是否会等待用户输入?那么,当没有用户输入时,动画将如何继续运行?前一段时间我遇到了这个问题,我在做一些输入阻塞的事情,当我按下一个键,lol时,我的游戏正在运行。这可以用60hz定时器解决,但这通常比简单的轮询带来更多的开销,因为你已经有了恒定的60hz。我知道这是一个多年前的答案。我认为您的
timeuntinextframeshouldstart
计算错误,它应该是“每帧有多少时间,减去整个帧所用的时间”,所以如果它是正值,您可以在剩余时间内睡眠:
timeuntinextframeshouldstart=FRAMELENGTH-(GetTime()-frameStartTime);如果(timeuntinextframeshouldstart>0.0){sleep(timeuntinextframeshouldstart);}