2017-04-09 4 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。

唯一の違いは、2番目の例では "end"変数を使用しています。私の意見では、このような違いはありません。私は、steady_clock :: now()と全く同じではないことを意味するend = steady_clock :: now()?

答えて

2

差は、条件が

と比較して、以前の一回の反復をトリガする場合は、ここ

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

now()戻り2つの異なる値の2つのインスタンス、従ってcounteraccumulator、次のと同期して文句を言わないことです

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

ここでは、accumulatorcounterの両方が同じ量だけインクリメントされるためです。

あなたは非常に予測できない出力in my case i got a 117が得られます

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

に二つの文の順序を変更することでこれを確認することができます。私はこのようにそれを記述したコードをさらに読みやすくするために

auto delta = end - begin; 
accumulator += delta; 
counter  += delta; 

複数回まったく同じことを入力して回避するために、常に良いです。この場合、同じ量だけインクリメントされていることが重要なので、コード内で明示してみてはいかがですか?

TL; DRsteady_clock::now()end = steady_clock::now()として、「同じ」であるが、あなたはそれを2回呼び出したときsteady_clock::now()は文句を言わない同じ値を返します。

+0

私はそれを見落としました。素早くお答えいただきありがとうございます。今はすべてが明らかです。 :) –

関連する問題