std :: chrono结果不同 - 固定时间步循环

时间:2017-04-09 09:43:41

标签: c++ chrono game-loop

有人可以帮我找出区别吗?因为第一个代码:

#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()完全一样吗?

1 个答案:

答案 0 :(得分:2)

不同之处在于

  accumulator += steady_clock::now() - begin;
  counter += steady_clock::now() - begin;

now()的两个实例返回2个不同的值,因此counter不会与accumulator同步,并且与

相比,下一个if条件将提前触发一次迭代
  end = steady_clock::now();
  accumulator += end - begin;
  counter += end - begin;

因为此处accumulatorcounter都增加了相同的金额。

您可以通过将两个语句的顺序更改为

来验证这一点
  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()在您调用两次时不会返回相同的值。