C ++使用std :: chrono

时间:2015-12-07 19:24:44

标签: c++ chrono

我的程序的fps不正确。当我使用RivaTuner统计数据计算我的应用程序的fps时,它给出了例如3000 fps。但是我的程序计算出一个非常不同的数字,比如500.它一直在上升和下降,而Rivatuner没有。

这是我计算deltatime的方法(deltaTime变量是一个浮点数):

std::chrono::high_resolution_clock timer;
auto start = timer.now();

...doing stuff here...

auto stop = timer.now();
deltaTime = std::chrono::duration_cast<std::chrono::microseconds>(stop - start).count() / 1000.0f; //DELTATIME WAS LESS THAN 1 MILLISECOND SO THAT IS WHY I USED THIS

这就是我计算fps的方法:

float fps = (1.0f / deltaTime) * 1000.0f;

我将我的游戏速度与deltaTime变量相乘,但是因为它做了一些奇怪的事情(一直在上下快速上升),这也被搞砸了。例如,我的RivaTuner说2000 fps我的游戏运行速度比4000 fps慢。

但是当应用程序运行速度较慢时,需要更多时间来渲染1帧(因此,deltaTime更高,所以游戏速度更高?)。

这是对的吗?

提前致谢。

2 个答案:

答案 0 :(得分:1)

  

[我的fps计数器]一直在上升和下降,而Rivatuner没有。

通常,渲染和其他计算需要不同的时间。如果你计算每帧的fps,那么它应该会上下移动。

deltaTime = std::chrono::duration_cast<std::chrono::microseconds>(stop - start).count() / 1000.0f;

不要那样做。如果您希望浮点值为毫秒且精度损失最小,请执行以下操作:

using ms = std::chrono::duration<float, std::milli>;
deltaTime = std::chrono::duration_cast<ms>(stop - start).count();
  

但是当应用程序运行速度较慢时,需要更多时间来渲染1帧

正确。

  

所以,更高的deltaTime

正确。

  

如此高的游戏速度?

如果所有内容都相对于传递的时间进行缩放,则渲染速度不应影响游戏的速度。在不知道你的游戏是什么的情况下,无法判断 是否会影响速度。

如果确实会影响游戏的速度,那么游戏实施方式可能会出现问题。如果您的行为对时间步长度很敏感,例如物理,那么这些计算应该使用固定的时间步长完成。例如,每秒120次。如果您的fps较高,则跳过模拟,如果您的fps较低,则重复模拟。

答案 1 :(得分:0)

就像JSQuareD所说的那样,在计算FPS时,你应该在测量很多帧之后取平均值。 原因是由于许多原因,帧执行速度往往非常不同。

总结你的测量结果,比如0.5秒并计算平均值。 是的,这听起来很愚蠢。

但你应该小心这个FPS统计数据 - 你甚至可能有60 FPS而且游戏看起来仍然会卡住。为什么?因为很少的帧花费了很长的增量时间,并且大多数帧花费了非常快的增量时间。 (它听起来比听起来更多)

您可以通过查看图表或计算标准偏差来解决最后一个问题,但现在这是更高级的问题。