2013-10-12 35 views
0

我之前問過一個問題,爲什麼我的球員的動作看起來不順暢,我被建議這樣做。變步時間,我誤解了嗎?

如果你想要(或需要)來降低CPU使用率,您可以保留的,因爲前一幀經過時間的計數,並且如果它沒有時間來運行的框架,睡一毫秒,否則運行幀。

但是,這樣做後,我的玩家應該儘可能快地(粗略估計)移動3-4倍。然而,我感到困惑的是,我的運動是基於delta時間,積累到每秒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

我並不完全理解你的問題,但我認爲你實際上是通過睡眠一毫秒來降低遊戲性能,你應該讓線程睡眠時間與TimeLeft一樣多,這會顯着提高性能,因爲它會安排下一次重新繪製更有效的方法框架

+0

這就是我之前所做的,但我被告知這是不準確的,我應該這樣做。 – Troubleshoot

+0

那麼你可以使用Timer類,它比線程更好 –

0

我發現我的問題。由於我正在計算重繪被調用時的增量時間,因此它的更改速度比更新被調用的速度快,這意味着它變化的速度比它應該更快。

如果其他人有這個問題,請計算您的主循環中的增量時間。