2010-03-03 93 views
2

在我们学校,通过将游戏构建为课程项目来实现我们从计算机科学课程中学到的不同概念是很常见的。现在我们在我们的机器上开发了我们的游戏,并且一切似乎都正常,游戏速度正常,等等。现在,当我们尝试在我们学校的计算机上测试我们的游戏,或者当我们的教授在他自己的计算机上测试我们的游戏时,让我们假设他的计算机与我们开发游戏的单位相比非常强大,游戏速度发生了巨大变化。在大多数情况下,游戏动画的发生速度会比预期的快。所以我的问题是,你如何在游戏应用程序中防止这种问题?是的,我们使用Java。在我们构建的大多数应用程序中,我们通常使用被动渲染作为渲染技术。提前tnx!如何使不同PC上的速度(游戏的帧速率)相同?

回答

6

你不应该依赖于你的游戏逻辑的渲染速度。相反,要记住从游戏中最后一个逻辑步骤到当前游戏所花费的时间。然后,如果花费的时间超过了一定数量,则执行一个游戏步骤(在极少数情况下,计算机如此缓慢以至于应该发生两个步骤,您可能想要提出一个智能解决方案来确保游戏不会不落后)。

通过这种方式,游戏逻辑与渲染逻辑是分开的,您不必担心游戏更改速度,具体取决于垂直同步是打开还是关闭,或者计算机比您的速度更慢或更快。

一些伪代码:

// now() would be whatever function you use to get the current time (in 
// microseconds or milliseconds). 
int lastStep = now(); 
// This would be your main loop. 
while (true) { 
    int curTime = now(); 

    // Calculate the time spent since last step. 
    int timeSinceLast = curTime - lastStep; 

    // Skip logic if no game step is to occur. 
    if (timeSinceLast < TIME_PER_STEP) continue; 

    // We can't assume that the loop always hits the exact moment when the step 
    // should occur. Most likely, it has spent slightly more time, and here we 
    // correct that so that the game doesn't shift out of sync. 
    // NOTE: You may want to make sure that + is the correct operator here. 
    //  I tend to get it wrong when writing from the top of my head :) 
    lastStep = curTime + timeSinceLast % TIME_PER_STEP; 

    // Move your game forward one step. 

} 
+0

好的,所以我必须在一定的时间后主动/手动呈现下一个游戏状态。好的TNX ... – ultrajohn 2010-03-03 09:16:52

+0

不,不一定。您在一段固定的时间后更新,但是只要您需要,就会进行渲染。另请参阅我答案中的链接。 – Kylotan 2010-03-03 15:01:14

+0

是的,这就是我的意思...我只是用错了的话......抱歉,所以渲染游戏图形等,但基于当前游戏状态更新游戏图形应该在固定时间之后完成。好的tnx家伙! – ultrajohn 2010-03-03 17:04:40

0

实现可移植性的最佳方法是在绘制每个帧之间以相同的延迟发出一些Thread.sleep()命令。那么结果将在每个系统中保持一致。由于您使用的是被动渲染,即直接在绘画中绘制动画,从那里调用Thread.sleep()可能并不是最好的想法...

也许您可以更新角蛋白变量,您的动画取决于每一对毫秒?