【发布时间】:2016-12-08 09:20:00
【问题描述】:
我正在尝试使用带有计时和线程的 C++ 来限制执行交叉检查的循环中的每秒帧数。
这是我的代码:
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
std::chrono::system_clock::time_point lastFrame = std::chrono::system_clock::now();
while (true)
{
// Maintain designated frequency of 5 Hz (200 ms per frame)
now = std::chrono::system_clock::now();
std::chrono::duration<double, std::milli> delta = now - lastFrame;
lastFrame = now;
if (delta.count() < 200.0)
{
std::chrono::duration<double, std::milli> delta_ms(200.0 - delta.count());
auto delta_ms_duration = std::chrono::duration_cast<std::chrono::milliseconds>(delta_ms);
std::this_thread::sleep_for(std::chrono::milliseconds(delta_ms_duration.count()));
}
printf("Time: %f \n", delta.count());
// Perform intersection test
}
我遇到的问题是 delta 的所有其他输出都显示微不足道的数量,而不是我的目标约为 200 毫秒/帧:
Time: 199.253200
Time: 2.067700
Time: 199.420400
Time: 2.408100
Time: 199.494200
Time: 2.306200
Time: 199.586800
Time: 2.253400
Time: 199.864000
Time: 2.156500
Time: 199.293800
Time: 2.075500
Time: 201.787500
Time: 4.426600
Time: 197.304100
Time: 4.530500
Time: 198.457200
Time: 3.482000
Time: 198.365300
Time: 3.415400
Time: 198.467400
Time: 3.595000
Time: 199.730100
Time: 3.373400
对为什么会发生这种情况有任何想法吗?
【问题讨论】:
-
您的时间似乎约为 200 毫秒,那么问题出在哪里?你不能指望得到任何接近准确时间的东西。你得到的比 200 少一点,然后你得到的多一点,处理它 - 你不会每次都得到正好 200。
-
我的目标不是精确的时间,但我不明白为什么有些循环迭代是 1-4 毫秒,而另一些是 ~200 毫秒。
-
因为有时你的 deltacount
-
操作系统可以随时安排您的程序 - 原因之一。你可能在某个地方做了一些愚蠢的事情,比如睡了一段时间......
-
假设由于所有睡眠的精度比预期的要短,您首先睡眠 198 毫秒,因此 delta 约为 198 毫秒,因此睡眠约 2 毫秒,因此您的 delta 约为 2 毫秒。