Sleep()をゲームループ(Windows)で使用しても安全ですか?


27

Windowsのゲームループ(C ++)でSleep()関数を使用しても安全ですか?フレームレートを固定したい。


「安全」とはどういう意味かを明確にする必要があります。もちろん、それは安全であり、メモリを破損したり、プレイヤーのPCを爆破したりすることはありません。
Kromsterは、サポートモニカ

回答:


32

いいえ、ちがいます。スリープは最低限のスリープ時間のみを保証しますが、実際にはそれ以上の任意の時間だけスリープする場合があります。タイマーの解像度(timeBeginPeriodで設定)も重要です。タイマーに他の何か(QueryPerformanceCounterなど)を使用している場合でも、スリープを制御するにはtimeBeginPeriodが必要です。

要約すると:

  • 睡眠時間は保証された最小値であり、実際の睡眠時間はそれより長い場合があります。
  • timeBeginPeriodを介して設定された(または設定されていない)値に敏感です。

スリープを使用するための唯一の合理的なケースは、モバイルデバイスなどのCPU使用率を削減したい場合です。それでも、スリープ(1)を使用することになります。フレームレートを制御するためにそれを使用することは、進むべき方法ではありません。

vsyncを強制的にオンにすることは、おそらく固定フレームレートを取得するための一般的な方法の1つですが、それでも、異なるハードウェアは異なるリフレッシュレートで実行され、異なるマシン間で一貫した固定フレームレートを持つことはできません(これはどのようなハードウェアによって異なりますもちろんターゲティングしています)。

この時点で、この記事に言及する必要があります:Gaffer On Games-Fix Your Timestep!。これは、シミュレーションで一貫したタイムステップを取得するために必要な手順を説明しています。


リンクをありがとう。これまで、私は通常、記事で説明されている「可変タイムステップ」アプローチを使用していました。
イヴァンヴチカ

Intelスピードステップが有効になっているマシンでは、スリープも危険です。
waterwizard11

「しかし、実際にはそれ以上の任意の時間スリープする可能性があります。」まあ、それは私が推測することを証明しなければなりません...それの証拠を見たことがないので、私はそれがそれらの「定義」の1つであると思います。しかし、良い答えは、そうです、固定フレームレートを設定するためにどんな種類のスリープを使用することもできません(それが実際に正確であったとしても)。
ヴァルモンド

2
MSDNによると-「準備ができたスレッドがすぐに実行されるとは限らないことに注意してください。その結果、スリープ間隔が経過するまでスレッドが実行されない可能性があります」。確かに、私はそれが起こるのを見たことがありませんが、同時にそれが可能だと文書化されているなら、私はそれが絶対に起こらないことに絶対に依存しません。
マキシマスミニマス

1
言及する価値が、私は「...あなたは、CPUの使用量を削減したい場合は...」これはに関連すると思う:nanobit.net/doxy/quake3/win__main_8c-source.html -関連するコードは01224で始まる<
user_123abc

16

簡単な答え:いいえ、違います。

フレームレートを固定するには、特定のフレームレートを強制する特定のコールバック関数を呼び出す必要があります。明らかに、ループ内の1回の反復にどれだけの時間がかかるかがわからなければ、固定スリープ時間を設定できません。

GLUTはglutTimerFunc()を提供します。これは、OpenGLでプログラミングしている場合、必要な適切な関数です。この例、またはこれを見てください。


1
少なくとも msecミリ秒後、OpenGLUTはコールバックを呼び出します」-それはどう違いSleepますか?
Kromsterは、サポートモニカ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.