[訳]GLUTチュートリアル-フレーム数/秒
3904 ワード
Lighthouse3d.com >> GLUT Tutorial >> Extras >> Frames per Second
あなたのプログラムは実際にどのくらい速く走っていますか.毎秒表示されるフレーム数にどのように影響するか、小さな場所を変更しても効果が現れるかどうか分からないことがあります.本節では、GLUTを用いて毎秒のフレーム数を算出する方法について説明する.これは本当にテストデータとは見なされず、参照値にすぎないことに注意してください.
GLUTは、glutInit関数を呼び出す際に使用するミリ秒数を取得する関数を提供する.この関数はglutGetで、プロトタイプは次のとおりです.
int glutGet(GLenum state);
state-必要な値を指定します
この関数は、フォーム座標の取得やOpenGLのバッファ深さの取得など、多くの態様で用いることができる.このセクションではglutInit関数を呼び出すときに使用するミリ秒数をGLUT_に保存します.ELAPSED_TIME传参中
この関数を用いて、プログラムの1秒当たりのフレーム数を算出する.すべてのフレームが同じレンダリング時間を使用するわけではないため、オペレーティングシステムはあなたのプログラムだけが実行しているわけではありません.オペレーティングシステムはその通行権を取得し、レンダリングされた物体に従ってレンズが変化する.従って、フレーム毎のレートの算出を回避する、1秒あたりのフレーム数を算出する.これにより、より正確な数値が提供されるが、それは依然として平均値である.
まず、3つの変数:frame、time、timebaseを宣言し、timebaseとframeを0に初期化します.
この3つの変数の役割は次のとおりです.
frame-フレームレートの統計を開始してから現在のフレーム数まで
time-もちろんミリ秒数
timebase-フレームレートの統計を開始してから現在までの時間
次のコードは、アイドルイベントの処理関数に入れると、上記の効果が得られます.
フレーム数を増やすことから、例えば各種フレームを増やす.次に、現在のイベントを記録する.次にtimebaseと比較して、timeとtimebaseが1000ミリ秒異なるかどうかを調べる.まだ時間がない場合は、計算部分をスキップします.しかし、1秒を超えても計算を行う.
timeとtimebaseとの差は、統計を開始するフレーム数から停止までのミリ秒数である.この値を1000で割ると経過秒数となる.残りは、この秒の数値に統計フレーム数の開始からレンダリングを停止するまでのフレーム数を乗じる、毎秒のフレーム数が得られる.最後にtimebaseを現在のミリ秒値にリセットしframeをゼロにします.
なお、プログラムのtimebaseが0である場合は、その値の初期化を待つまで1秒待つ.最初の初期値には、フォームを初期化するのにかかる時間が含まれているため、誤導がある.テストすると、この値は実際のフレームレートよりはるかに低いことがわかります.
1秒あたりのフレーム数を出力したい場合は、次のコードを使用します.
あなたのプログラムは実際にどのくらい速く走っていますか.毎秒表示されるフレーム数にどのように影響するか、小さな場所を変更しても効果が現れるかどうか分からないことがあります.本節では、GLUTを用いて毎秒のフレーム数を算出する方法について説明する.これは本当にテストデータとは見なされず、参照値にすぎないことに注意してください.
GLUTは、glutInit関数を呼び出す際に使用するミリ秒数を取得する関数を提供する.この関数はglutGetで、プロトタイプは次のとおりです.
int glutGet(GLenum state);
state-必要な値を指定します
この関数は、フォーム座標の取得やOpenGLのバッファ深さの取得など、多くの態様で用いることができる.このセクションではglutInit関数を呼び出すときに使用するミリ秒数をGLUT_に保存します.ELAPSED_TIME传参中
int time;
...
time = glutGet(GLUT_ELAPSED_TIME);
この関数を用いて、プログラムの1秒当たりのフレーム数を算出する.すべてのフレームが同じレンダリング時間を使用するわけではないため、オペレーティングシステムはあなたのプログラムだけが実行しているわけではありません.オペレーティングシステムはその通行権を取得し、レンダリングされた物体に従ってレンズが変化する.従って、フレーム毎のレートの算出を回避する、1秒あたりのフレーム数を算出する.これにより、より正確な数値が提供されるが、それは依然として平均値である.
まず、3つの変数:frame、time、timebaseを宣言し、timebaseとframeを0に初期化します.
int frame=0,time,timebase=0;
この3つの変数の役割は次のとおりです.
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秒待つ.最初の初期値には、フォームを初期化するのにかかる時間が含まれているため、誤導がある.テストすると、この値は実際のフレームレートよりはるかに低いことがわかります.
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();
...