如何获取和使用时间增量


14

我的游戏中有老鼠在看和走,但它们非常缓慢且难以使用。我认为这是因为我使用固定速度。我听说在大型项目中,开发人员使用时间增量。如何计算过剩的三角洲时间?如何使用增量时间计算速度?


Answers:


18

“增量时间”曾经是两次帧更新之间经过的时间(但也可以在其他情况下使用;通常是时间相减的结果)。

您可以使用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上阅读固定时间步长与可变时间步长。


它以毫秒为单位返回毫秒吗?毛额,可能还不够。我一直不得不使用特定于平台的计时器,然后像瘟疫一样避免使用GLUT,因为它对游戏而言不是很好。
肖恩·米德迪奇

@Sean我也不使用GLUT,但这是在问题的参数中,因此我谨记此为;)但是,您对int处理游戏中“毫秒”的“不足”的立场深感兴趣。一个positive int通常会高达2.147.483.647一旦签署和高达4.294.967.295如果无符号......所以即使我们考虑到一个较小的,2.147.483.647毫秒是近25天... ...这应该是相当足以应付大多数游戏计时器,即使这还不够,我们仍然可以合理地使用unsigned int(约50天)甚至是合理的时间long long(就像我通常那样)。
Valkea

1
@Valkea关键不是最大,而是低端的分辨率。由于以60 FPS传输的单个帧仅为16 2 / 3rds ms,因此1ms的精度(以毫秒为单位表示整数)表示的误差范围大于5%,足以使模拟远远超出预期。微秒的整数计数是可以接受的,但毫秒数太粗糙了。
Steven Stadnicki

是的,在很多事情上,您需要不到一毫秒的时间,并且需要一个高分辨率的计时器才能找到,这是GLUT无法提供的(我知道)。只需编写一些平台代码以QueryPerformanceCounter在Windows和gettimeofday其他大多数平台上使用,也不错。您将不得不动手,并且要比平台API的最小公分母有更多目标,尤其是在C和C ++中。
肖恩·米德迪奇

这种精度并非对所有游戏都有用。但是,这是一个非常有趣的解释,完全可以回答我有关您关于int和Clocks的观点的询问。我还不需要高精度时钟,但是我想是时候加深我对此事的了解了。谢谢;)
Valkea
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.