나는 왜 내 선수의 움직임이 부드럽게 보이지 않는지에 대한 질문을했고, 나는 이것을 제안했다. 당신이 원하는 (또는 필요) CPU 사용량을 줄일 경우변수 시간대, 오해입니까?
, 그렇지 않으면 실행, 당신은 이전 프레임 이후 경과 된 시간의 수를 유지할 수 있으며, 1 밀리 초에 대한 절전 모드가 프레임을 실행하려면 아직 시간이 아니라면 틀.
그러나 그렇게 한 후, 내 선수는 3-4 배속으로 대략 (대략적인) 예상대로 이동합니다. 내가 혼란스러워하는 것은, 나의 움직임이 초당 1000-1005 밀리 초 사이에 축적되는 델타 시간에 근거한다는 것입니다. 가변 시간 단계를 사용하면 게임 업데이트가 프레임 속도에 관계없이 동일한 속도로 진행되어야한다고 생각했습니다. 내가 틀렸는가, 아니면 내가 잘못하고있는 것인가?
메인 루프
private static final int UPDATE_RATE = 60;
private static final float UPDATE_PERIOD = 1000F/UPDATE_RATE;
private void mainLoop() {
long beginTime, timeTaken;
float timeLeft;
while (state == State.PLAYING) {
beginTime = System.nanoTime();
update();
repaint();
timeTaken = System.nanoTime() - beginTime;
timeLeft = (timeTaken/16000F);
if (timeLeft < UPDATE_PERIOD) {
try {
Thread.sleep(1);
} catch (InterruptedException ex) { }
}
}
}
private void update() {
p.move(deltaTime);
}
운동 알고리즘 :
public void move(float deltaTime) {
if(left && !right)
xPos -= 250*(deltaTime/1000);
if(right && !left)
xPos += 250*(deltaTime/1000);
}
(마다 다시 그리기가 호출) 델타 시간 계산 :
long currentTime = System.nanoTime();
deltaTime = (currentTime - previousTick)/1000000F;
previousTick = currentTime;
그게 내가 전에하고 있었던 일이지만, 그것이 틀렸다는 말을 듣고 이렇게해야 해. – Troubleshoot
그럼 Timer 클래스를 사용하면 스레드보다이 방법이 더 좋습니다. –