2011-12-08 7 views
0

VSYNCを使用せずにFPSを固定することについて簡単に質問があります。VSYNCなしの固定フレームレート描画ループの作成に関する考え方

私は現在、描画間の時間を計算している の描画ループを持っており、フレームレートを試して安定させるのに必要な時間を引いています。

static clock_t dt = clock(); 
static clock_t startDraw; 
static clock_t endDraw; 

while (_running) 
{ 
    update(); 

    // Draw after desired elapsed time 
    if (clock() - dt >= _timestep) 
    { 
     startDraw = clock(); 
     draw(); 
     _window->SwapBuffer(); 
     endDraw = clock(); 
     dt = clock() - (endDraw- startDraw); 
    } 
} 

_timeStepが60fpsのを表現するために、現在16ですが、私は後で30fpsのにこれを変更することもできます。

は、ここで私が今持っているものです。

これはVSYNCがないと40〜62fpsの間で変動するので、アプローチが間違っているか、何かを見落としているかどうかはわかりません。

私の目標は、VSYNCのトグルを設定することです。実際にこの機能を追加したいのです。

注:私はレンダリングにOpenGL_2.0を使用しています。

答えて

0

このコードに気付いたことがいくつかあります。

まず第一に、あなたの最後の行:だから何あなたが現在測定していることは、あなたが最後の()ドローと呼ばれるので、ジャストインタイムで

endDraw = clock(); 
dt = startDraw; 

endDraw = clock() 
dt = clock() - (endDraw - startDraw); 

は同じです。あなたは実際に描くのに必要な時間を差し引いていません。

ここで、なぜその変動が大きいのかについては、これはいくつかの理由によるものです。あなたのタイミングコードでは、update()を呼び出す時間と各評価時にdraw()を呼び出す時間を合計します。つまり、測定の粒度はupdate()+ draw()の実行に要する時間によって制限されます。実際には、fpsリミットループは60 fpsの最大fpsに上限を設定しますが、実行されている作業量に応じて60 fpsよりはるかに遅く実行される可能性があります。それは、なぜあなたが40fpsを見ているのかを説明します。あなたが見た62fpsは、単なる丸め誤差か、fpsをどのように測定しているかによるかもしれません。

たとえば、update()+ draw()が4msかかる場合、あなたの現在の "clock() - dt" の評価は最後のドローから15msで、次回の評価では最後のドローから19msでした。このフレームが遅いfpsで実行されることを意味します。

draw()ロジックを別のスレッドで実行することで、少し安定させることができます。つまり、update()のコストはレンダリングループに含まれません。しかし、これは更新を同期するような他の複雑さを増やすので、身体の位置がまだ更新されていない間に人の頭の更新された位置を描かないようにします。

私の質問は、なぜフレームレートを60fpsに制限しようとしているのですか?それはCPU使用量を減らすことですか?あなたがCPU使用について気にしないなら、実際には3画面バッファシステムを使うことができます。可能な限り頻繁にdraw()を実行し、別のスレッドでSwapBuffer()を60fpsで呼び出すだけです(もちろん同期には注意してください)。 SwapBufferはdraw()やupdate()よりもはるかに軽量なので、かなり安定したfpsが得られます。

+0

私の主な関心事はCPU使用量です。私の目標は、NDKを通じてAndroidのサポートを追加することです。私は現在、SwapBufferでダブルバッファリングを使用しています。 – redsting

+0

あなたが考えることができる1つのことは、draw()の前にSwapBufferを行うことです。そうすれば、ディスプレイが最初にリフレッシュされます(タイミングコードでdraw()のコストがかからないようにします)。これにより、わずかに安定したリフレッシュレートが得られます。唯一の注意点は、画面のリフレッシュが常に1フレーム遅れることですが、通常の30fpsまたは60fpsのアプリケーションでは大したことではないはずです。 – Skyd

関連する問題