2017-04-09 10 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;

유일한 차이점은 두 번째 예의 "end"변수를 사용하는 것입니다. 내 의견으로는 그런 차이가 없어야합니다. 내 말은, steady_clock :: now()가 end = steady_clock :: now()와 정확히 똑같은가요?

답변

2

차는

에 비해 counter 못해 한 반복 이전 트리거 accumulator 및 실행 조건은 다음과 동기화 될 여기에 따라서
accumulator += steady_clock::now() - begin; 
    counter += steady_clock::now() - begin; 

now() 창 (2)에 다른 값의 두 인스턴스

이며
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()으로 "동일"입니다,하지만 당신은 두 번 호출 할 때 steady_clock::now() 늘 같은 값을 반환합니다.

+0

나는 그것을 간과했다. 빠른 답변 주셔서 감사합니다. 모든 것이 이제 분명합니다. :) –