我想创建一个简单的2D游戏。我不想使用线程。编程语言将是Java(但可以是任何语言,并不重要......)。
如果我使用像while(true)...
这样的主循环(无限循环),是否可以避免高CPU使用率?
答案 0 :(得分:3)
在游戏中,你通常有一个运行一切的主循环。但是,为了避免做不必要的事情,通常只以特定的帧速率(例如每秒60帧(FPS))更新游戏。
大多数游戏通过使CPU休眠直到需要计算/绘制新帧来实现此目的。在python游戏库pygame中,这是使用pygame.time.wait:
完成的将暂停一段给定的毫秒数。此函数会暂停进程以与其他程序共享处理器。等待几毫秒的程序将消耗很少的处理器时间。
答案 1 :(得分: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.6ms,上面的循环将会中断,所以我们有特殊的代码来检测它并赶上或丢弃帧,但这是基本的想法。此外,直到最近我们实际上并没有使用浮点数作为时间,而是使用定点微秒计数器。
答案 2 :(得分:0)
你要做的就是“阻止输入”......你得到零 CPU使用率。无论如何,直到事情发生。
几乎任何套接字程序都会有这样的循环:
while (true) {
select ()
...
您可以轻松等待“getchar()
”或“WaitOnSingleEvent()
”
有人可能会说“阻止I / O”实际上是最佳设计策略。它击败了替代品 - “民意调查”(Polling is Evil)。
IMHO ..