2011-04-10 61 views
3

所以我在想,如果我是正確的計算我的FPS:我正確計算我的FPS嗎?

Uint32 delayFrom(float startTime, float endTime){ 
    return(endTime - startTime); 
} 


int main(){ 
    int numFrames = 0; 
    Uint32 startTime = SDL_GetTicks(); 
    while(!done){ 
     frameTime = 0; 
     float fps = (numFrames/(float)(SDL_GetTicks() - startTime))*1000; 
     cout << fps << endl; 
     SDL_Delay(delayFrom(frameTime, 1/60)); 
     ++numFrames; 
    } 
} 

回答

6
int main() { 
    int numFrames = 0; 
    Uint32 startTime = SDL_GetTicks(); 
    while (!done) { 
    ++numFrames; 
    Uint32 elapsedMS = SDL_GetTicks() - startTime; // Time since start of loop 
    if (elapsedMS) { // Skip this the first frame 
     double elapsedSeconds = elapsedMS/1000.0; // Convert to seconds 
     double fps = numFrames/elapsedSeconds; // FPS is Frames/Seconds 
     cout << fps << endl; 
    } 
    SDL_Delay(1.0/60.0); // Use floating point division, not integer 
    } 
} 
+0

@Erik:我理解的很好 - 你檢查每一幀,如果它是第一幀?如果是這樣,我不喜歡它...我會用一些其他的構造或只是讓第一幀中的fps計算錯誤(如果當然可以接受) – relaxxx 2011-04-10 19:58:49

+1

@relaxxx:好吧,在分割之前檢查elapsedMS或elapsedSeconds - 除以0是有點令人討厭,並且與典型遊戲框架中完成的工作相比,0的單個測試根本無關緊要。但是,是的,當然可以編寫循環來避免這種檢查 - 如果你願意冒險/確保第一幀不能在0ms完成 – Erik 2011-04-10 20:03:27

+0

@Erik我只是因爲這些檢查會導致非常可怕代碼...這當然不是那麼糟糕,但是我看過一次代碼,每個遊戲框架中的作者都檢查了if(introMoviePlayed())和其他東西...... :) – relaxxx 2011-04-10 20:12:33

0

frameTime的永遠不會被分配任何0以外想必這是一個錯誤。

0

cout可能比較緩慢,從而得到更精確的值,你需要分割時間測量和輸出結果。

int main(){ 
    int numFrames = 0;  
    long totalTime = 0; 
    while(!done){ 
     // measure time 
     const Uint32 startTime = SDL_GetTicks(); 
     SDL_Delay(1.0f/60.0f); 
     const Uint32 endTime = SDL_GetTicks(); 

     // calculate result 
     totalTime += endTime - startTime; 
     ++numFrames; 
     float fps = numFrames/(totalTime/1000.0); 
     cout << fps << endl; 
    } 
} 
+0

總的時間應該最好在一個積分 - 否則你會在一段時間後得到不精確的時間 - 產生奇怪的錯誤,可以保持一個隊連續幾個晚上很忙:( – Erik 2011-04-10 19:21:39

+0

最有可能你是對的 – 2011-04-10 19:25:28

+0

我已經度過了那些夜晚爲此,發佈前幾天:) – Erik 2011-04-10 19:59:51