Language agnostic 如何正确计算时间增量?

Language agnostic 如何正确计算时间增量?,language-agnostic,game-engine,game-physics,Language Agnostic,Game Engine,Game Physics,我正在尝试创建一个具有独立帧速率的游戏,myObject以每毫秒一个单位的速度向右移动。但是,我不知道如何在这段代码中计算deltaTime: var currentTime = 0; var lastTime = 0; var deltaTime = 0; while( play ) { // Retrieve the current time currentTime = Time.now(); deltaTime = currentTime

我正在尝试创建一个具有独立帧速率的游戏,
myObject
以每毫秒一个单位的速度向右移动。但是,我不知道如何在这段代码中计算
deltaTime

var currentTime = 0;
var lastTime = 0;
var deltaTime = 0;

while( play ) {

    // Retrieve the current time
    currentTime = Time.now();            
    deltaTime = currentTime - lastTime;  
    lastTime = currentTime;

    // Move myObject at the rate of one unit per millisecond
    myObject.x += 1 * deltaTime;       
}
假设第一帧需要30毫秒,因此
deltaTime
应该是30,但它是0 因为我们只知道帧开始的时间,而不知道帧结束的时间。然后,在第二帧中需要40毫秒,因此
deltaTime
为30,因此
myObject.x
为30。但是,经过的时间是70毫秒(第一帧30毫秒+第二帧40毫秒),因此
myObject.x
应该是70,而不是30

我不是在模拟物理,我只是试着相对于经过的时间(不是帧)移动
myObject

如何正确计算
deltaTime

我知道有些游戏引擎的人会占用大量的时间,所以他们会提前制作动画。此外,我已经读过格伦·费德勒和其他许多书,但我仍然感到困惑。

试试这个:

float LOW_LIMIT = 0.0167f;          // Keep At/Below 60fps
float HIGH_LIMIT = 0.1f;            // Keep At/Above 10fps

float lastTime = Time.now();

while( play ) {

   float currentTime = Time.now();
   float deltaTime = ( currentTime - lastTime ) / 1000.0f;
   if ( deltaTime < LOW_LIMIT )
      deltaTime = LOW_LIMIT;
   else if ( deltaTime > HIGH_LIMIT )
      deltaTime = HIGH_LIMIT;

   lastTime = currentTime;

   myObject.x += 1000 * deltaTime;     // equivalent to one unit per ms (ie. 1000 per s)
}
float LOW_LIMIT=0.0167f;//保持在60帧/秒以下
浮动上限=0.1f;//保持在10帧/秒以上
float lastTime=Time.now();
边玩{
float currentTime=Time.now();
浮点数时间=(当前时间-上次时间)/1000.0f;
if(增量时间<下限)
deltaTime=下限;
否则如果(延迟时间>上限)
deltaTime=上限;
lastTime=当前时间;
myObject.x+=1000*deltaTime;//相当于每毫秒一个单位(即每秒钟1000个单位)
}
这有很多错误,但它更容易说明基本概念

首先,请注意,在循环开始之前,需要使用一些值初始化
lastTime
。您可以使用较低的值(即Time.now()-33),以便第一帧产生所需的增量,或者像我一样使用它(您将看到我们在循环中限制了它)

接下来,您将获得每个froame开始时的当前时间,并使用它计算自上次循环以来经过的时间(在本示例的第一次运行中,该时间将为零)。然后我喜欢将其转换为,因为以“每秒”工作比以“每毫秒”工作更有意义,但可以随意删除
/1000.0f
部分,以毫秒为单位

然后,您需要将deltaTime限制在一些可用的范围内(例如,我使用了10-60fps,但您可以根据需要进行更改)。这只是防止循环运行过快或过慢。高_限制特别重要,因为它可以防止非常大的delta值,这可能会导致游戏循环中的混乱(最好是有点不准确,而不是让代码分解)-低_限制可以防止零(或非常小)的时间步长,这可能同样有问题(特别是对于物理)

最后,一旦您计算了此帧的新增量时间,您就可以保存当前时间,以便在下一帧中使用。

尝试以下操作:

float LOW_LIMIT = 0.0167f;          // Keep At/Below 60fps
float HIGH_LIMIT = 0.1f;            // Keep At/Above 10fps

float lastTime = Time.now();

while( play ) {

   float currentTime = Time.now();
   float deltaTime = ( currentTime - lastTime ) / 1000.0f;
   if ( deltaTime < LOW_LIMIT )
      deltaTime = LOW_LIMIT;
   else if ( deltaTime > HIGH_LIMIT )
      deltaTime = HIGH_LIMIT;

   lastTime = currentTime;

   myObject.x += 1000 * deltaTime;     // equivalent to one unit per ms (ie. 1000 per s)
}
float LOW_LIMIT=0.0167f;//保持在60帧/秒以下
浮动上限=0.1f;//保持在10帧/秒以上
float lastTime=Time.now();
边玩{
float currentTime=Time.now();
浮点数时间=(当前时间-上次时间)/1000.0f;
if(增量时间<下限)
deltaTime=下限;
否则如果(延迟时间>上限)
deltaTime=上限;
lastTime=当前时间;
myObject.x+=1000*deltaTime;//相当于每毫秒一个单位(即每秒钟1000个单位)
}
这有很多错误,但它更容易说明基本概念

首先,请注意,在循环开始之前,需要使用一些值初始化
lastTime
。您可以使用较低的值(即Time.now()-33),以便第一帧产生所需的增量,或者像我一样使用它(您将看到我们在循环中限制了它)

接下来,您将获得每个froame开始时的当前时间,并使用它计算自上次循环以来经过的时间(在本示例的第一次运行中,该时间将为零)。然后我喜欢将其转换为,因为以“每秒”工作比以“每毫秒”工作更有意义,但可以随意删除
/1000.0f
部分,以毫秒为单位

然后,您需要将deltaTime限制在一些可用的范围内(例如,我使用了10-60fps,但您可以根据需要进行更改)。这只是防止循环运行过快或过慢。高_限制特别重要,因为它可以防止非常大的delta值,这可能会导致游戏循环中的混乱(最好是有点不准确,而不是让代码分解)-低_限制可以防止零(或非常小)的时间步长,这可能同样有问题(特别是对于物理)

最后,一旦您计算了此帧的新增量时间,您就可以保存当前时间,以便在下一帧中使用。

尝试以下操作:

float LOW_LIMIT = 0.0167f;          // Keep At/Below 60fps
float HIGH_LIMIT = 0.1f;            // Keep At/Above 10fps

float lastTime = Time.now();

while( play ) {

   float currentTime = Time.now();
   float deltaTime = ( currentTime - lastTime ) / 1000.0f;
   if ( deltaTime < LOW_LIMIT )
      deltaTime = LOW_LIMIT;
   else if ( deltaTime > HIGH_LIMIT )
      deltaTime = HIGH_LIMIT;

   lastTime = currentTime;

   myObject.x += 1000 * deltaTime;     // equivalent to one unit per ms (ie. 1000 per s)
}
float LOW_LIMIT=0.0167f;//保持在60帧/秒以下
浮动上限=0.1f;//保持在10帧/秒以上
float lastTime=Time.now();
边玩{
float currentTime=Time.now();
浮点数时间=(当前时间-上次时间)/1000.0f;
if(增量时间<下限)
deltaTime=下限;
否则如果(延迟时间>上限)
deltaTime=上限;
lastTime=当前时间;
myObject.x+=1000*deltaTime;//相当于每毫秒一个单位(即每秒钟1000个单位)
}
这有很多错误,但它更容易说明基本概念

首先,请注意,在循环开始之前,需要使用一些值初始化
lastTime
。您可以使用较低的值(即Time.now()-33),以便第一帧产生所需的增量,或者像我一样使用它(您将看到我们在循环中限制了它)

接下来,您将获得每个froame开始时的当前时间,使用它计算自上次循环以来经过的时间(将