【发布时间】:2016-10-26 12:29:57
【问题描述】:
我正在制作游戏,并且正在实施FPS 上限。但它并没有真正起作用,因为它不是很精确。
这是我的代码:
public static volatile int FPS_CAP = 60;
@Override
public void run() {
long lastTime = System.nanoTime();
double amountOfTicks = 60.0;
double ns = 1000000000 / amountOfTicks;
double delta = 0;
long timer = System.currentTimeMillis(), lastRender;
while (running) {
long now = System.nanoTime();
delta += (now - lastTime) / ns;
lastTime = now;
while (delta >= 1) {
tick();
delta--;
}
lastRender = System.currentTimeMillis();
draw.render();
draw.fps++;
if (FPS_CAP != -1) {
try {
int nsToSleep = (int) ((1000 / FPS_CAP) - (System.currentTimeMillis() - lastRender));
if (nsToSleep > 1 / FPS_CAP) {
Thread.sleep(nsToSleep);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (System.currentTimeMillis() - timer > 1000) {
timer += 1000;
draw.lastFPS = draw.fps;
draw.fps = 0;
// updates = 0;
}
}
}
如您所见,它确实不准确,有时比 60 低很多,有时又高一点!有时达不到 60 的问题不是我的 PC 硬件,因为解锁时我得到 1700-2000 FPS。我希望它尽可能精确。
提前致谢。
【问题讨论】:
-
嗯,这可能是因为
System.currentTimeMillis并不总是非常准确?虽然是以毫秒为单位的时间,但它的分辨率取决于操作系统,它可以以 10 或 15 毫秒的步长增加。在 60 fps 时,您说的是每帧 16.7 毫秒,这样可能会有所不同吗? -
Java 不够精确,无法实现这种精确机制。所有渲染库实际上都依赖于 C 或 C++ 层来管理实时精度。
-
@Arjan 不可能是因为这个,因为当我将其上限设置为 100(即每帧 10 毫秒)时也不准确。
-
@GuillaumeF。有什么解决办法吗?
-
建议“不要使用 Java...”是愚蠢的。有许多 Java 游戏库,应该指出一个可以很好地满足他的需求的库。我也很好奇新的 Java 8 时间库中是否有任何用处? docs.oracle.com/javase/8/docs/api/java/time/…
标签: java graphics2d frame-rate