게임을 만들고 있는데 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;
}
}
}
그것은 60 FPS에서 FPS 상한해야 대신는 결과가됩니다 : 당신이 그것을 볼 수 있듯이 이
정말 의
이
는 내가 가지고있는 코드입니다 정확하지 않은, 때로는 60보다 훨씬 낮고 때로는 조금 더 높습니다! 그리고 때로는 60에 도달하지 못하는 문제는 PC 하드웨어가 아닌데 1700-2000 FPS를 얻을 때부터입니다. 가능한 한 정확하도록하고 싶습니다.미리 감사드립니다.
흠 이것은'System.currentTimeMillis'가 항상 정확하지 않다는 사실 때문일 수 있습니까? ms 단위의 시간이지만 해상도는 OS에 따라 다르며 10 또는 15ms 단위로 증가 할 수 있습니다. 60fps에서 프레임 당 약 16.7ms 가량 차이가 날 수 있습니다. – Arjan
Java는 이러한 정밀 메커니즘을 구현하기에 충분하지 않습니다. 모든 렌더링 라이브러리는 실제로 실시간 정밀도를 관리하기 위해 C 또는 C++ 계층에 의존합니다. –
@Arjan 왜냐하면 100 캡 (프레임 당 10ms)으로 모자를 씌우면 정확하지 않기 때문입니다. – L3n