2013-10-12 3 views
0

나는 왜 내 선수의 움직임이 부드럽게 보이지 않는지에 대한 질문을했고, 나는 이것을 제안했다. 당신이 원하는 (또는 필요) 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; 

답변

0

나는 당신의 문제를 잘 이해하지 못했지만 실제로는 1 밀리 초의 시간 동안 잠자고 게임 성능을 저하시키고 있다고 생각합니다. 스레드를 TimeLeft만큼 잠자기 상태로 두어야합니다. 다음 번에 다시 칠할 시간을 정하기 때문에 성능이 크게 향상됩니다. 더 효과적인 방법으로 프레임

+0

그게 내가 전에하고 있었던 일이지만, 그것이 틀렸다는 말을 듣고 이렇게해야 해. – Troubleshoot

+0

그럼 Timer 클래스를 사용하면 스레드보다이 방법이 더 좋습니다. –

0

내 문제를 발견했습니다. 재 페인트가 호출 될 때 델타 시간을 계산할 때 업데이트가 호출되는 것보다 빠르게 변경되었으므로 변경해야하는 것보다 훨씬 빠르게 변경되었습니다.

다른 누구도이 문제가 발생하면 메인 루프에서 델타 시간을 계산하십시오.