我正在写一个相当简单的2D多人-过网络游戏。现在,我发现自己几乎不可能创建一个稳定的循环。我认为稳定的意思是这样的循环,在这种循环中进行了一定的计算,并在严格的时间段内重复(例如,每25毫秒,这就是我现在正在为之奋斗的时间)。除此之外,我还没有遇到过很多严重的障碍。试图创造一个稳定的游戏引擎循环
在这个游戏中,多个线程运行,无论是在服务器和客户端应用程序,分配给各种任务。我们以服务器应用程序中的引擎线程为例。在这个主题中,我尝试使用Thread.sleep创建游戏循环,尝试考虑游戏计算所花费的时间。这里是我的循环,放在run()方法中。 Tick()函数是循环的有效载荷。它只是包含对不断更新游戏的其他方法的有序调用。
long engFPS = 40;
long frameDur = 1000/engFPS;
long lastFrameTime;
long nextFrame;
< ...>
while(true)
{
lastFrameTime = System.currentTimeMillis();
nextFrame = lastFrameTime + frameDur;
Tick();
if(nextFrame - System.currentTimeMillis() > 0)
{
try
{
Thread.sleep(nextFrame - System.currentTimeMillis());
}
catch(Exception e)
{
System.err.println("TSEngine :: run :: " + e);
}
}
}
的主要问题是,刚才的Thread.sleep爱背叛你约多少会睡的预期。它可以很容易地把线程休息或更长的时间更短的时间,特别是在一些机器上的Windows XP(我测试过它自己,WinXP中给出真是可恶结果相比Win7和其他OS)。我在互联网上搜索了很多,结果令人失望。这似乎是我们正在运行的操作系统的线程调度程序的错误,以及它的所谓粒度。据我了解,这个调度程序在一定的时间内不断检查系统中每个线程的需求,特别是把它们从睡眠中唤醒/唤醒。当重新检查时间很短(如1ms)时,情况看起来很平稳。虽然,据说WinXP的粒度高达10或15毫秒。我也读过,不仅是Java程序员,而且使用其他语言的人也面临这个问题。知道这一点,制作稳定,坚固,可靠的游戏引擎似乎几乎是不可能的。尽管如此,它们无处不在。 我非常想知道用哪种方法可以解决这个问题。更有经验的人能给我一个提示吗?
以最大FPS运行并根据实际帧时间而不是常数进行计算。 – Erik 2011-03-23 12:13:57