Java:wait()将fps限制为64

时间:2012-02-28 22:05:48

标签: java limit wait synchronized frame-rate

我在主循环的代码中有这个(窗口中的2D游戏):

try{
  synchronized(this){

    wait(3);
  }
}
catch(Exception ex) {
  System.out.println(ex);
}

这段代码导致FPS上限为64,我不知道为什么。我不使用任何其他同步块。有趣的是,当Web浏览器打开时,fps不再受限制。谁能告诉我如何摆脱64 fps的限制?我没有找到解决此问题的任何其他主题。

编辑:

  • 没有等待(3); - 180fps。
  • 等待(3)和浏览器(Opera)打开 - ~113 fps。
  • 使用wait(3)并且没有浏览器 - 64 fps。

浏览器如何更改fps?

3 个答案:

答案 0 :(得分:5)

虽然waitsleep参数的分辨率以毫秒为单位,但您几乎肯定不会得到您要求的延迟。

在Windows系统上,分辨率大约为15毫秒,给出1000/15 = 66fps

答案 1 :(得分:2)

如果你不使用任何其他同步块,那么你的线程就没有人notify()。这意味着您可能会告诉您的应用在每次迭代时至少休眠3毫秒。此外,由于线程在进入休眠状态时放弃其时间量,并且时钟分辨率通常也超过1 ms(取决于操作系统),因此可能会损失更多时间。

64 FPS表示帧略高于15 ms。告诉我们你的"无上限" FPS是,计算它翻译的每帧多少毫秒,看看有什么区别。如果没有丢失代码的帧时间差异大约为3-10毫秒(10毫秒可能是理智系统上时钟粒度的合理上限),它可能只是{{1 }}。如果没有wait()你的帧只花1毫秒,可能会有一些额外的效果。

在Jan评论后编辑:115 FPS表示每帧8.7毫秒。因为wait()而从那里走到15似乎很可能。我不确定在后台运行其他应用程序会如何影响它。也许在后台有另一项任务会影响调度程序的行为。另一项任务是否将FPS恢复到115或某个中间值?

在Jan的第二条评论之后编辑:如果它是180而不是115,我们每帧有5.5毫秒。这增加了差异,但是由于Windows时钟相当粗糙(正如其他人指出的那样),这仍然在上述效果的限制范围内。

答案 2 :(得分:0)

不要试图超过60 fps。现代显示器的显示速度不会超过60fps。