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(); ...