【问题标题】:C++ Incorrect FPS and deltaTime measuring using std::chrono使用 std::chrono 测量 C++ 不正确的 FPS 和 deltaTime
【发布时间】:2015-12-07 19:24:44
【问题描述】:

我的程序的 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 越高,游戏速度就越高?)。

这对吗?

提前致谢。

【问题讨论】:

  • 您是否分别重新计算每一帧的 fps?这可以解释你的结果的跳跃性。如果您在更长的时间内取平均值,您将获得更准确的结果。
  • 即使我这样做了,游戏速度仍然很跳跃。
  • 在多少帧/多长时间内对结果进行平均?

标签: c++ chrono


【解决方案1】:

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

总结您的测量值,假设 0.5 秒并计算平均值。 是的,这听起来很愚蠢。

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

您可以通过查看图表或计算标准差来解决上一个问题,但目前这是更高级的问题。

【讨论】:

    【解决方案2】:

    [我的 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 较低,则重复模拟。

    【讨论】:

    • 我做到了,但仍然如此。当 fps 变低时,游戏速度会变慢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 2019-10-10
    • 2014-07-16
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多