我在主循环的代码中有这个(窗口中的2D游戏):
try{
synchronized(this){
wait(3);
}
}
catch(Exception ex) {
System.out.println(ex);
}
这段代码导致FPS上限为64,我不知道为什么。我不使用任何其他同步块。有趣的是,当Web浏览器打开时,fps不再受限制。谁能告诉我如何摆脱64 fps的限制?我没有找到解决此问题的任何其他主题。
编辑:
浏览器如何更改fps?
答案 0 :(得分:5)
虽然wait
和sleep
参数的分辨率以毫秒为单位,但您几乎肯定不会得到您要求的延迟。
在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。