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开始时的当前时间,使用它计算自上次循环以来经过的时间(将