[译]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();...?
轉載于:https://www.cnblogs.com/live41/p/3393941.html
總結
以上是生活随笔為你收集整理的[译]GLUT教程 - 每秒帧数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实验5-2
- 下一篇: Memcached Client 使用手