2013-10-12 21 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

我发现我的问题。由于我正在计算重绘被调用时的增量时间,因此它的更改速度比更新被调用的速度快,这意味着它变化的速度比它应该更快。

如果其他人有这个问题,请计算您的主循环中的增量时间。