2017-04-09 50 views
2

有人能帮我找出差异在哪里吗?因为第一代码:std :: chrono不同的结果 - 固定的时间步进循环

#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;

唯一的区别是在第二个示例中使用“结束”变量。在我看来,它不应该造成这样的差异。我的意思是,不是steady_clock :: now()与end = steady_clock :: now()完全相同?

回答

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; 

因为这两个,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; DRsteady_clock::now()是“相同”的end = steady_clock::now(),但steady_clock::now()当你调用它两次不会返回相同的值。

+0

我忽略了它。谢谢你的快速回复。现在一切都很清楚。 :) –