Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;使用std::chrono测量的FPS和deltaTime不正确_C++_Chrono - Fatal编程技术网

C++ C++;使用std::chrono测量的FPS和deltaTime不正确

C++ C++;使用std::chrono测量的FPS和deltaTime不正确,c++,chrono,C++,Chrono,我的程序的fps不正确。当我使用RivaTuner统计数据计算应用程序的fps时,它给出了例如3000 fps。但是我的程序计算出一个完全不同的数字,比如500。它一直在上下波动,而Rivatuner却没有 这是我计算deltatime的方式(deltatime变量是浮点): 我用deltaTime变量乘以我的游戏速度,但是因为它做了一些奇怪的事情(整个时间都在快速地上升和下降),这也被搞砸了。例如,我的RivaTuner显示每秒2000帧,我的游戏运行速度比显示每秒4000帧时慢 但是当应用程

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

这是我计算deltatime的方式(deltatime变量是浮点):

我用deltaTime变量乘以我的游戏速度,但是因为它做了一些奇怪的事情(整个时间都在快速地上升和下降),这也被搞砸了。例如,我的RivaTuner显示每秒2000帧,我的游戏运行速度比显示每秒4000帧时慢

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

这是正确的吗


提前感谢。

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

对测量值求和,比如说0.5秒,然后计算平均值。 是的,这听起来很愚蠢

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

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

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

通常,渲染和其他计算需要不同的时间。如果您计算每帧的fps,那么它将上下浮动

deltaTime = std::chrono::duration_cast<std::chrono::microseconds>(stop - start).count() / 1000.0f;
deltaTime=std::chrono::duration\u cast(停止-启动).count()/1000.0f;
不要那样做。如果希望浮点值为毫秒且精度损失最小,请执行以下操作:

using ms = std::chrono::duration<float, std::milli>;
deltaTime = std::chrono::duration_cast<ms>(stop - start).count();
使用ms=std::chrono::duration;
deltaTime=std::chrono::duration_cast(停止-开始).count();
但当应用程序运行较慢时,渲染1帧需要更多时间

所以,一个更高的Delatime

那么更高的游戏速度

渲染速度不应该影响游戏的速度,如果所有的东西都是按时间缩放的。如果不知道你的游戏会做什么,就无法判断它是否会影响速度


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

是否分别重新计算每帧的fps?这就解释了你结果的不稳定性。如果你在更长的时间内取平均值,你会得到更准确的结果。即使我这样做,游戏速度仍然很快。在多少帧/多少时间内,你的平均结果?我这样做了,但仍然如此。当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();