有人可以帮我找出区别吗?因为第一个代码:
#include <iostream>
#include <chrono>
#include <ratio>
using namespace std::chrono;
const nanoseconds timePerFrame = duration_cast<nanoseconds>(duration<steady_clock::rep, std::ratio<1, 60>>(1));
nanoseconds accumulator(0);
nanoseconds counter(0);
steady_clock::time_point begin;
int i = 0;
int main()
{
while(true)
{
begin = steady_clock::now();
while(accumulator >= timePerFrame)
{
accumulator -= timePerFrame;
++i;
}
accumulator += steady_clock::now() - begin;
counter += steady_clock::now() - begin;
if(counter >= seconds(1))
{
std::cout << i << std::endl;
break;
}
}
}
输出:30,第二个代码:
#include <iostream>
#include <chrono>
#include <ratio>
using namespace std::chrono;
const nanoseconds timePerFrame = duration_cast<nanoseconds>(duration<steady_clock::rep, std::ratio<1, 60>>(1));
nanoseconds accumulator(0);
nanoseconds counter(0);
steady_clock::time_point begin;
steady_clock::time_point end;
int i = 0;
int main()
{
while(true)
{
begin = steady_clock::now();
while(accumulator >= timePerFrame)
{
accumulator -= timePerFrame;
++i;
}
end = steady_clock::now();
accumulator += end - begin;
counter += end - begin;
if(counter >= seconds(1))
{
std::cout << i << std::endl;
break;
}
}
}
输出:60;
唯一的区别是使用&#34; end&#34;第二个例子中的变量。在我看来,它不应该导致这种差异。我的意思是,不是stable_clock :: now()与end = steady_clock :: now()完全一样吗?
答案 0 :(得分:2)
不同之处在于
accumulator += steady_clock::now() - begin;
counter += steady_clock::now() - begin;
now()
的两个实例返回2个不同的值,因此counter
不会与accumulator
同步,并且与
end = steady_clock::now();
accumulator += end - begin;
counter += end - begin;
因为此处accumulator
和counter
都增加了相同的金额。
您可以通过将两个语句的顺序更改为
来验证这一点 counter += steady_clock::now() - begin;
accumulator += steady_clock::now() - begin;
将产生非常不可预测的输出in my case i got a 117。
为了使代码更具可读性,我会这样写:
auto delta = end - begin;
accumulator += delta;
counter += delta;
避免多次输入完全相同的内容总是好的。在这种情况下,它们增加相同的数量真的很重要,那么为什么不在代码中明确它呢?!
TL; DR steady_clock::now()
与#34;相同&#34;如end = steady_clock::now()
,但steady_clock::now()
在您调用两次时不会返回相同的值。