1秒あたりのフレーム数を制限する利点は何ですか?(もしあれば)


13

私はOpenGLでシンプルなゲームに取り組んでおり、ディスプレイの初期化と入力にSDLを使用していますが、タイミングに関しては2つの選択肢があります。最適なTimePerFrame-theTimeTakenToRenderでスリープ状態にある1つ目は、最適なTimePerFrameの秒数= 1 / theFramerateCapです。(vsyncを使用するのと同等であるため、これが必要かどうかは完全にはわかりません。これはより正確かもしれません。私の仮定が正しい場合、SDL + OpenGLがデフォルトでvsyncを持っているかどうかを教えてください。もう1つは、最後のフレームがレンダリングされてからの時間を測定し、それに応じて移動を調整することです。(フレームのレンダリングにかかる​​時間が短いほど、そのフレーム内でのエンティティの移動が少なくなります)。パフォーマンス、およびフリッカーの減少などに関して、これら2つの方法の長所と短所は何ですか?

回答:


15

あなたのフレーム時間は予測不可能である場合(これはあなたのせいであるかどうか、OSはなど、時折リソースを使用することができる)、あなたの実現可能なフレームレートが予測のために多くのことを行いますよりもやや低い予測可能なフレームレートにキャッピングレイテンシーた缶、ゲームの雰囲気をより良くします。

入力を処理してからその入力に関連する変更をレンダリングするまでの時間を変更すると、たとえ平均的に達成している場合でも、気分が悪い 少ない 2の間の待ち時間を、「ジッターは」(意識的または無意識のうちに)人間には目立つことができます。

ここでの洞察については、Microsoft GameFestのプレゼンテーション「フレーム内の内容:ティアリング、レイテンシ、フレームレート」を参照してください。カーマックも持っていますこれに役立つ一連のブログ投稿もあります。

また、低いdeltaT値を使用してフレームを実行する場合、または変数deltaTをまったく使用する場合でも、いくつかの数学が壊れることがあることに注意してください(物事にとって重要である「安定した」予測可能な方法で行うことは難しくなり、さらに扱いにくくなる場合がありますリプレイやいくつかの形式のネットワーク同期など)。詳細については、ここでタイムステップ修正するをご覧ください。


1
(ちなみに、私は非常に「スリープ」の方法によってキャッピングないお勧めします。あなたのVSYNCの状況があなたを駆動するために、ご使用のプラットフォームおよび使用vsyncの上にあるかを把握それははるかに予測可能だと通常より少ないリソースを使用しています。。)
リアンダー

おかげで、私は間違いなくフレームレートを制限しようとします。SDLを使用してvsyncを有効にする方法を知っていますか?
w4etwetewtwet

1
SDL 2.0では、あなたは、例えば、SDL_CreateRendererコールにフラグSDL_RENDERER_PRESENTVSYNCを渡すことでVSYNCを有効にすることができますSDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
TJS

12

使用するCPUがはるかに少なくなり(マルチタスク担当者に感謝します)、モバイルデバイスのユーザーもこれを高く評価します。


4
言うまでもなく、電力消費量の削減(モバイルデバイス/ラップトップにとって重要)、および発熱量の減少です。
-zeel

メニューのFPSが900fpsのように無制限で非常に高く、CPU / GPU->より高い温度->より多くのノイズを本当に強調したゲームの問題を思い出します。
Kromsterは、サポートモニカ

10

スリープを使用してフレームレートを制御しないでください

これは以前に終わりました。その理由を説明するために、他の質問を参照します。言及されていないことの1つは、60Hzの典型的な最新のリフレッシュレートでは、スリープコールの典型的な1ミリ秒の粒度では、フレーム間で正しい時間だけスリープすることは実際に不可能であるということです。

何もしなければCPUを譲ることは悪いことだと言っていません。それから遠い。ただし、フレームレートを制御するのと同じことではなく、スリープは前者には適していますが、後者には適していません。

代わりに、経過時間をチェックし、フレームを実行する時間であれば、そうします。そうでなければ-CPUを譲りたい場合-最低限の時間-1ミリ秒スリープします。また、適切な解像度が得られるように、スリープタイマーがプラットフォームに適切に設定されていることを確認してください。つまり、「Sleep(1)」コールを発行すると、15、20、または30(そうでない場合)のようなものではなく、実際に1ミリ秒間スリープする可能性があります。SDLがこれを自動的に行うと信じています。

また、フレームに余裕を持たせることもできます。これにより、フレームを実行する時間が近づいたら、スリープを停止し、フレームが実行されるまでフラットアウトを開始します。

これが最終的にどのように見えるかは、Sleep(1)コールの束が時折フレームに散在していることであり、それで構いません。必要のない場合でもCPUをあきらめますが、フレームは時間どおりに実行できます。



0

前述のように、CPU使用率が低下します。反対に、ますます重要になっていることは、バッテリー寿命も消耗します。良い例として、FTAはMBAでほぼ100%のCPUで実行されます。その結果、2時間以上でバッテリーが消耗し、非常に高温になります。(より直接的な結果として、私はアンインストールし、もう再生しません...)。フレームキャップがこれを防ぎます。

言及されていないもう1つの利点は、マルチプレイヤーゲームの場合、全員に同じエクスペリエンスを提供することで競技場を平準化することです。


フレームレートとゲームの更新ループを同じ速度で実行する必要はありません。そのため、同じエクスペリエンスを人々に与えることは、フレームレートだけに依存しません。
トーマス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.