Java 如何使不同电脑的速度(游戏帧速率)相同?

Java 如何使不同电脑的速度(游戏帧速率)相同?,java,Java,在我们学校,在实施我们从计算机科学课上学到的不同概念时,通常会将游戏作为课堂项目。现在我们在我们的机器上开发了我们的游戏,一切似乎都很好,游戏速度正常等等。现在,当我们尝试在学校的计算机上测试我们的游戏时,或者当我们的教授在他自己的计算机上测试我们的游戏时,我们可以说他的计算机与我们开发游戏的单位相比功能强大得多,游戏的速度发生了巨大的变化。。。在大多数情况下,游戏动画会发生得比预期的快。所以我的问题是,如何在游戏应用程序中防止这种问题?是的,我们使用Java。在我们构建的大多数应用程序中,我们

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

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


也许你可以每隔几毫秒更新一次你的动画所依赖的ceratin变量?

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

这样,游戏逻辑与渲染逻辑是分开的,你不必担心游戏改变的速度取决于垂直同步是开还是关,或者电脑比你的慢还是快

一些伪代码:

// 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.

}
//now()将是用于获取当前时间的任何函数(在
//微秒或毫秒)。
int lastStep=now();
//这将是你的主循环。
while(true){
int curTime=now();
//计算自上一步以来所花费的时间。
int timeSinceLast=curTime-lastStep;
//如果没有游戏步骤发生,跳过逻辑。
如果(timesineclast<每步时间)继续;
//我们不能假设循环总是在步进时到达准确的时刻
//应该发生。最有可能的是,它花费了稍多的时间,这里我们
//纠正这一点,使游戏不会失去同步。
//注意:您可能需要确保+是此处的正确运算符。
//当我从头开始写的时候,我往往会弄错:)
lastStep=curTime+timesineclast%TIME\u每步;
//将游戏向前推进一步。
}

您还可以使用来控制动画速率。这里有一个简单的例子。

好的,所以我必须在一段固定的时间后主动/手动渲染下一个游戏状态。好的,tnx…不,不一定。在一段固定的时间后进行更新,但可以在需要时进行渲染。请看我答案中的链接。是的,这就是我的意思。。。我只是用错了词。。。抱歉,因此需要渲染游戏图形等,但基于当前游戏状态更新游戏图形应在固定时间后完成。。好的,伙计们!您可能会发现这篇文章很有趣:。