[譯]GLUT教程 - 每秒幀數


Lighthouse3d.com >> GLUT Tutorial >> Extras >> Frames per Second

 

你的程序實際上跑得多快? 有時我們我們改了一個小地方卻不確定效果有沒有表現出來,即它們如何影響每秒顯示的幀數.本節我們會來看怎么使用GLUT來計算出每秒的幀數.注意這不能看作是真是測試數據,它只是個參考值.

GLUT提供一個函數來查詢系統中的很多特性,其中之一是獲取調用glutInit函數時使用的毫秒數.該函數是glutGet,原型如下:

 

int glutGet(GLenum state);

state - 指定我們需要的值

 

該函數可以用於很多方面,例如獲取窗體坐標或者獲取OpenGL的緩沖深度.本節我們用它來獲取調用glutInit函數時使用的毫秒數,保存在GLUT_ELAPSED_TIME傳參中.

 

int time;

...

time = glutGet(GLUT_ELAPSED_TIME);

 

現在用該函數來計算程序每秒的幀數.幀與幀之間的速率是變化的,因為並非所有幀都用相同的渲染時間,因為操作系統不是只有你的程序在運行.操作系統取得它的通行權,然后鏡頭隨着渲染的物體而改變.因此我們將會避免計算每一幀的速率,而去計算每秒大概的幀數.這樣會提供一個更精確的數值,雖然它也仍然只是一個均值.

先聲明三個變量: frame, time和timebase, 其中timebase和frame初始化為0.

int frame=0,time,timebase=0;

這三個變量作用是:

frame - 我們從開始統計幀速率到現在的幀數

time - 當然的毫秒數

timebase - 我們從開始統計幀速率到現在的時間

 

下面這段代碼,只要放到空閑事件的處理函數中,就會實現上述效果:

...

    frame++;
    time=glutGet(GLUT_ELAPSED_TIME);

    if (time - timebase > 1000) {
        fps = frame*1000.0/(time-timebase));
         timebase = time;
        frame = 0;
    }
    ...

 

我們從增加幀數開始,例如增加各種幀.然后記錄當前事件.然后我們對比timebase來檢查讀秒,例如看time和timebase是否相差1000毫秒.如果還未到時間,會先跳過計算部分.然而即使超過了1秒,我們也會進行計算.

從time和timebase的差是提供了開始統計幀數到停止所經過的毫秒數.該值除以1000就是所經過的秒數.剩下要做是把該秒數值乘以從開始統計幀數到停止所渲染的幀數,就得到了每秒的幀數.最后我們重置timebase到當前的毫秒值,把frame置零.

注意,如果程序的timebase為0,就要先等1秒來等待初始化該值.一開始的初始值會有誤導,因為該值里面包含了初始化窗體消耗的時間.你測試一下就會發現該值會遠比實際幀速率低.

如果你想輸出每秒的幀數,你可以使用以下代碼:

    ...
    frame++;
    time=glutGet(GLUT_ELAPSED_TIME);
    if (time - timebase > 1000) {
        sprintf(s,"FPS:%4.2f",
            frame*1000.0/(time-timebase));
        timebase = time;
        frame = 0;
    }

    glColor3f(0.0f,1.0f,1.0f);

    glPushMatrix();
    glLoadIdentity();
    setOrthographicProjection();
    renderBitmapString(30,35,(void *)font,s);
    glPopMatrix();
    restorePerspectiveProjection();

    ...

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM