Answers:
“增量时间”曾经是两次帧更新之间经过的时间(但也可以在其他情况下使用;通常是时间相减的结果)。
您可以使用glutGet方法和GLUT_ELAPSED_TIME参数以及一些操作来获取glut中的增量时间。
以下行返回自调用glutInit(或首次调用glutGet(GLUT_ELAPSED_TIME))以来的毫秒数:
int timeSinceStart = glutGet(GLUT_ELAPSED_TIME);
因此,如果在每个渲染循环中注册当前的timeSinceStart,则可以通过将旧值减去新值来了解deltaTime。
int oldTimeSinceStart = 0;
while( ... )
{
int timeSinceStart = glutGet(GLUT_ELAPSED_TIME);
int deltaTime = timeSinceStart - oldTimeSinceStart;
oldTimeSinceStart = timeSinceStart;
//... stuff to update using deltaTime
}
您也可以使用几乎相同的方法,将C / C ++ ctime库与clock()和宏常量表达式CLOCKS_PER_SEC一起使用,该常量指定时钟滴答和秒数之间的关系。
基本上,您可以使用deltaTime来更新与该经过时间成比例的运动,而不是使用固定的时间值。这样,如果程序以60 fps运行或以10 fps运行,则角色的移动速度应该几乎相同。
这是一个小例子:假设您想在x轴上每秒移动10个单位。您可以执行以下操作(如果deltaTime确实使用毫秒)。
Position.x += 10/1000 * deltaTime;
这样,无论您的程序是更新2次还是更新100次,位置在1秒后都应该几乎相同,并且与使用固定值的情况相比,小型计算机的低fps对游戏的影响也较小。
固定值==>低fps =更新少=慢速运动,而高fps =更新多=快运动。
与deltaTime ==>“几乎”相同的动作。
最后,您应该在gamedev.stackexchange上阅读固定时间步长与可变时间步长。
positive int
通常会高达2.147.483.647一旦签署和高达4.294.967.295如果无符号......所以即使我们考虑到一个较小的,2.147.483.647毫秒是近25天... ...这应该是相当足以应付大多数游戏计时器,即使这还不够,我们仍然可以合理地使用unsigned int
(约50天)甚至是合理的时间long long
(就像我通常那样)。
QueryPerformanceCounter
在Windows和gettimeofday
其他大多数平台上使用,也不错。您将不得不动手,并且要比平台API的最小公分母有更多目标,尤其是在C和C ++中。