3

我正在开发一款游戏,只是想在另一台计算机上对其进行测试,以检查分辨率是否正常以及所有这些东西,但注意到一个大问题,游戏由于某种原因以慢动作运行......不是滞后,而是缓慢运动..我的游戏循环是暂时的:

while(gameisRunnin){
     doStuff();
     Thread.sleep(1000/60);

但是在测试之后,我试图检查doStuff();编写代码需要多少时间,我像这样测试它:

while(gameisRunnin){
     long startT = System.currentTimeMillis();
     doStuff();
     long stopT = System.currentTimeMillis();
     System.out.println(stopT-startT);
     Thread.sleep(1000/60);

它给我的结果是 0,在两台计算机上,(我正在开发的游戏以完美的速度运行,而在 PC 上它以慢动作运行。我还用纳米时间对其进行了测试,它给出了我也喜欢两台计算机上的 50000-80000 (几乎相同的结果。说真的怎么了?超人能救我吗?

更新:好的,所以当我在另一台计算机上运行游戏而不是全屏时,它运行正常,但是当它全屏时,它是慢动作更新:看起来我是这里的超级英雄,我已将显示模式设置为刷新率未知,我想这就是整个问题......

4

3 回答 3

2

您必须使用通常称为“增量时间”的东西。基本上这意味着,您测量进行一次游戏循环迭代所需的时间,然后将这个数字用于所有动作。

这是因为不同计算机上的 FPS 计数不同。您可以定义速度并动态计算移动的实际大小,而不是仅仅为恒定数量的像素移动对象。

简短的例子:

public void gameLoop() {
    long initialTime = System.nanoTime();

    game.redraw();
    game.update(System.nanoTime() - initialTime);
}

// inside the class Game
public void update(long deltaTime) {
    someObject.moveToRight(deltaTime * speed);
}
于 2013-10-06T18:57:47.740 回答
1

答案是显示器不支持游戏的刷新率,将刷新率从 60 更改为DisplayMode.REFRESH_RATE_UNKNOWN修复慢动作问题。

于 2013-10-06T19:47:00.970 回答
0

阅读这篇文章:点击这里

另外,作为旁注,使用System.nanoTime()因为 System.getTimeMillis() 不准确。

于 2013-10-06T18:48:23.130 回答