Я делаю игра и я реализую FPS колпачок. Но это не работает, так как это не очень точно.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;
}
}
}
Это должно быть укупорки FPS на 60 кадров в секунду, но вместо того, чтобы результат:
Как вы можете видеть это действительно неточно, иногда это намного ниже 60, а иногда и выше! И проблема иногда не достигая 60 не относится к моему оборудованию для ПК, так как при разблокировке я получаю 1700-2000 FPS. Я хочу, чтобы он был как можно более точным.
Заранее спасибо.
Хмм, возможно, это связано с тем, что 'System.currentTimeMillis' не всегда очень точен? Хотя это время в мс, его разрешение зависит от ОС, и оно может увеличиваться с шагом 10 или 15 мс. При 60 кадрах в секунду вы говорите о 16,7 мс за кадр, чтобы это могло изменить ситуацию? – Arjan
Java недостаточно точен для достижения таких механизмов точности. Все библиотеки рендеринга на самом деле полагаются на уровень C или C++ для управления точностью в реальном времени. –
@Arjan Это не может быть из-за этого, потому что, когда я закрываю его на 100 (что равно 10 мс на фрейм), тоже неточно. – L3n