[译]GLUT教程 - 每秒帧数
Lighthouse3d.com >> GLUT Tutorial >> Extras >>?Frames per Second
?
你的程序?qū)嶋H上跑得多快? 有時(shí)我們我們改了一個(gè)小地方卻不確定效果有沒有表現(xiàn)出來(lái),即它們?nèi)绾斡绊懨棵腼@示的幀數(shù).本節(jié)我們會(huì)來(lái)看怎么使用GLUT來(lái)計(jì)算出每秒的幀數(shù).注意這不能看作是真是測(cè)試數(shù)據(jù),它只是個(gè)參考值.
GLUT提供一個(gè)函數(shù)來(lái)查詢系統(tǒng)中的很多特性,其中之一是獲取調(diào)用glutInit函數(shù)時(shí)使用的毫秒數(shù).該函數(shù)是glutGet,原型如下:
?
int glutGet(GLenum state);
state - 指定我們需要的值
?
該函數(shù)可以用于很多方面,例如獲取窗體坐標(biāo)或者獲取OpenGL的緩沖深度.本節(jié)我們用它來(lái)獲取調(diào)用glutInit函數(shù)時(shí)使用的毫秒數(shù),保存在GLUT_ELAPSED_TIME傳參中.
?
int time;...time = glutGet(GLUT_ELAPSED_TIME);?
現(xiàn)在用該函數(shù)來(lái)計(jì)算程序每秒的幀數(shù).幀與幀之間的速率是變化的,因?yàn)椴⒎撬袔加孟嗤匿秩緯r(shí)間,因?yàn)椴僮飨到y(tǒng)不是只有你的程序在運(yùn)行.操作系統(tǒng)取得它的通行權(quán),然后鏡頭隨著渲染的物體而改變.因此我們將會(huì)避免計(jì)算每一幀的速率,而去計(jì)算每秒大概的幀數(shù).這樣會(huì)提供一個(gè)更精確的數(shù)值,雖然它也仍然只是一個(gè)均值.
先聲明三個(gè)變量: frame, time和timebase, 其中timebase和frame初始化為0.
int frame=0,time,timebase=0;這三個(gè)變量作用是:
frame - 我們從開始統(tǒng)計(jì)幀速率到現(xiàn)在的幀數(shù)
time - 當(dāng)然的毫秒數(shù)
timebase - 我們從開始統(tǒng)計(jì)幀速率到現(xiàn)在的時(shí)間
?
下面這段代碼,只要放到空閑事件的處理函數(shù)中,就會(huì)實(shí)現(xiàn)上述效果:
...frame++;time=glutGet(GLUT_ELAPSED_TIME);if (time - timebase > 1000) {fps = frame*1000.0/(time-timebase));timebase = time;frame = 0;}...?
我們從增加幀數(shù)開始,例如增加各種幀.然后記錄當(dāng)前事件.然后我們對(duì)比timebase來(lái)檢查讀秒,例如看time和timebase是否相差1000毫秒.如果還未到時(shí)間,會(huì)先跳過計(jì)算部分.然而即使超過了1秒,我們也會(huì)進(jìn)行計(jì)算.
從time和timebase的差是提供了開始統(tǒng)計(jì)幀數(shù)到停止所經(jīng)過的毫秒數(shù).該值除以1000就是所經(jīng)過的秒數(shù).剩下要做是把該秒數(shù)值乘以從開始統(tǒng)計(jì)幀數(shù)到停止所渲染的幀數(shù),就得到了每秒的幀數(shù).最后我們重置timebase到當(dāng)前的毫秒值,把frame置零.
注意,如果程序的timebase為0,就要先等1秒來(lái)等待初始化該值.一開始的初始值會(huì)有誤導(dǎo),因?yàn)樵撝道锩姘顺跏蓟绑w消耗的時(shí)間.你測(cè)試一下就會(huì)發(fā)現(xiàn)該值會(huì)遠(yuǎn)比實(shí)際幀速率低.
如果你想輸出每秒的幀數(shù),你可以使用以下代碼:
...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();...?
轉(zhuǎn)載于:https://www.cnblogs.com/live41/p/3393941.html
總結(jié)
以上是生活随笔為你收集整理的[译]GLUT教程 - 每秒帧数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实验5-2
- 下一篇: Memcached Client 使用手