フレームレートの制限


9

最も成功した競争力のあるゲームエンジンが好きでid TechGoldSrcSourceおよびなどは、フレームレートの制限が可能になります。

30、60、99、72、68などでプレイできます。つまり、上限を設定して上限を制御できます。

フレームレートをどのように制限しますか?

コードではなく理論に興味があります。


好奇心からして、他のプロセスのためにサイクルを解放する以外に、これのポイントは何ですか?
3Dave

1
@DavidLively、ラップトップについて考えてみてください。それらは非常に高いフレームレートで非常に簡単に過熱しますが、60 fpsのキャップを使用すると(とにかく無意味です。

競争の激しいゲームでは、60から100 fpsの間のスパイクではなく、均一なフレームレートを使用するのが最適です。時々、一部のアクションはフレームレートに依存し、時間に依存しないため、等しいフレームレートでこれらのアクションの感触をつかむことができます。ところで、VSyncを有効にすると、ゲームの最大fpsが常にリフレッシュレートと同じになることに注意してください(ドライバーがこれを処理します)。
ロイT.

回答:


7

理論は次のとおりです。最後にフレームをレンダリングした時刻を確認し、まだ別のフレームを描画する時間ではない場合は、描画しないでください。


8

フレームレートを60 fpsに制限するとします。つまり、すべてのフレームのレンダリング時間は1/60秒= 16,67ミリ秒(四捨五入)になります。

フレームレートを制限するには、ゲームループの開始時に時間を確認するだけで、それをゲームループの終了時の時間と比較できます。差が16.67ms未満の場合は、その時間の間ストールする必要があります。

これを行う1つの方法は、以下を使用することです。

sleep(waittime)

しかし以来 sleep(x)、スレッドが最小xミリ秒の間生成される、時間内に制御を取得できるかどうかは確実にはわかりません。

より良い方法は以下を使用することです:

while(timediff < 16.67ms){ sleep(0); }

これにより、スレッドが生成され、できるだけ早く制御が戻されます。

別の解決策は、ビジー待機ループを設けることです。これにより、最高の制御が得られますが、CPUを不必要に使用します。

OSスケジューラは常にスレッドから制御を奪う可能性があるため、多少の変動に備えてください。


明確に「1 / 60s」。:)
Richard Marskell-Drackir 2012年

このソリューションは本当に悪いです。vsyncを有効にした場合、またはOSが何かを行うことにした場合、フレームレートは大きく変動します。
タラ

@Dudesonなぜそれが悪いのですか?(これは、Quake3 btwで使用される手法です)。FPSが60未満の場合、ループはスキップされます。したがって、FPSを可能な限り高く維持しますが、60を超えることはありません。–
ロイT.

@RoyT。興味深い...その情報はどこから入手したのですか?ソースコードから?また、ループで待機するのは悪いことだと言っています。これは、エンジンでそれを行った方法とまったく同じであり、多くの痛みを引き起こします。問題は、(GPUドライバーで)vsyncをオンにしたときに、コードでフレームレートをさらに制限しようとすると、多くのフレームドロップが発生することです。タイミングがすべてのフレームで完璧ではないためです。私はvsyncの問題について話しているだけです。vsyncがなければ、これは問題ではありません。そして、vsyncがQuake 3日間で今日と同じ種類の取引だったかどうかはわかりません。
タラ

@Dudesonは、忙しい待機と睡眠が心配だったので、しばらく前に誰かに指摘されました。v-syncがオンになっている場合、わずかに見落とすと、30 fpsと60 fpsの間で変動する可能性があることがわかりました。しかし、私はそれがどんなテクニックでも起こると思います(これはFreeSyncが軽減しようとするものではありません)。コードによるフレームレートの制限、またはコンピュータが60fpsでレンダリングできないため、常にこの問題が発生すると思います:)
Roy T.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.