2014-10-09 57 views
0

我試圖通過調用我在我的顯示()回調函數的開始進行自定義CalculateFrameRate方法來計算GLUT窗口的幀率。我在計算後調用glutPostRedisplay(),我執行每一幀,因此Display()被每幀調用。使用clocks_per_sec太慢計算過量幀率

我也有一個int numFrames增量每幀(每次glutPostRedisplay被調用),我也打印出來。我的CalculateFrameRate方法計算的速率大約爲7 fps,但如果我查看一個秒錶並將其與我的numFrames增量速度增加的速度進行比較,則幀速率很容易爲25-30 fps。

我似乎無法弄清楚爲什麼會有這種差異。我下面貼

clock_t lastTime; 
int numFrames; 

//GLUT Setup callback 
void Renderer::Setup() 
{ 
    numFrames = 0; 
    lastTime = clock(); 
} 

//Called in Display() callback every time I call glutPostRedisplay() 
void CalculateFrameRate() 
{ 
    clock_t currentTime = clock(); 
    double diff = currentTime - lastTime; 
    double seconds = diff/CLOCKS_PER_SEC; 
    double frameRate = 1.0/seconds; 
    std::cout<<"FRAMERATE: "<<frameRate<<endl; 

    numFrames ++; 
    std::cout<<"NUM FRAMES: "<<numFrames<<endl; 
    lastTime = currentTime; 
} 

回答

4

功能clock我CalcuateFrameRate方法(除了在Windows中)給你的CPU時間使用,所以如果你不旋轉整個框架的CPU時間,那麼它會給你比預期的時間要短。相反,如果有16個內核運行16個線程,則clock報告的時間將是實際時間的16倍。

您可以使用std::chrono::steady_clockstd::chrono::high_resolution_clock,或者如果您使用Linux/Unix,gettimeofday(它給你微秒的分辨率)。

這裏有一對夫婦如何使用gettimeofday來衡量毫秒片斷:

double time_to_double(timeval *t) 
{ 
    return (t->tv_sec + (t->tv_usec/1000000.0)) * 1000.0; 
} 

double time_diff(timeval *t1, timeval *t2) 
{ 
    return time_to_double(t2) - time_to_double(t1); 
} 

gettimeofday(&t1, NULL); 
... do stuff ... 
gettimeofday(&t2, NULL); 
cout << "Time taken: " << time_diff(&t1, &t2) << "ms" << endl; 

這裏有一段代碼來說明如何使用std::chrono::high_resolution_clock

auto start = std::chrono::high_resolution_clock::now(); 
... stuff goes here ... 
auto diff = std::chrono::high_resolution_clock::now() - start; 
auto t1 = std::chrono::duration_cast<std::chrono::nanoseconds>(diff); 
+0

謝謝!使用你的第一個建議,它計算出我的新幀速率在25-30 fms之間,這與我用秒錶計算的速度一致。 – user1782677 2014-10-09 08:15:00

+2

在Linux上**不要**使用gettimeofday,因爲該函數報告的值可以進行調整(NTP,用戶更改時鐘等)。 *您想使用'clock_gettime(CLOCK_MONOTONIC,...)'。 – datenwolf 2014-10-09 09:10:57

+0

爲了獲得時間戳來計算開發過程中的幀速率,'gettimeofday'將會很好 - 因爲發生錯誤的事情是相對罕見的事件。如果你正在編寫一個使用時間來確定遊戲過程中敵人進度的應用程序,那麼出於上述原因使用'gettimeofday'顯然不是很好。 – 2014-10-09 20:40:29