Ist es sicher, Sleep () in der Spieleschleife (unter Windows) zu verwenden?

27

Ist es sicher, die Sleep () - Funktion unter Windows in Game Loop (C ++) zu verwenden? Ich möchte eine feste Bildrate haben.

Hämogoblin
quelle
Sie müssen klären, was Sie unter "sicher" verstehen. Natürlich ist es sicher und wird den Speicher nicht beschädigen oder den PC des Spielers in die Luft jagen.
Kromster sagt Unterstützung Monica

Antworten:

32

Nein, ist es nicht. Schlaf garantiert nur eine minimale Zeit zum Schlafen, aber es kann tatsächlich für eine beliebige Zeitspanne darüber schlafen. Ihre Timer-Auflösung (über timeBeginPeriod festgelegt) ist ebenfalls wichtig. Auch wenn Sie für Ihren Timer etwas anderes (wie QueryPerformanceCounter) verwenden, benötigen Sie timeBeginPeriod, um den Ruhezustand zu steuern.

Also zusammenfassend:

  • Die Zeit zum Schlafen ist nur ein garantiertes Minimum und die tatsächliche Schlafzeit kann höher sein.
  • Sensitiv für den über timeBeginPeriod eingestellten (oder nicht eingestellten) Wert.

Der einzig vernünftige Fall für die Verwendung des Energiesparmodus wäre, wenn Sie die CPU-Auslastung für z. B. mobile Geräte reduzieren möchten. Selbst dann würden Sie Sleep (1) verwenden; es zu verwenden, um Frameraten zu steuern, ist nicht der richtige Weg.

Das Erzwingen von vsync ist wahrscheinlich eine gängige Methode, um eine feste Bildrate zu erhalten, aber selbst dann wird unterschiedliche Hardware mit unterschiedlichen Aktualisierungsraten ausgeführt, und Sie können auf unterschiedlichen Computern keine konsistente feste Bildrate erzielen (dies hängt von der Art der Hardware ab) Sie zielen natürlich).

Zu diesem Zeitpunkt ist es notwendig, diesen Artikel zu erwähnen: Gaffer On Games - Fix Your Timestep! . Das beschreibt die Schritte, die Sie benötigen, um einen konsistenten Zeitschritt in Ihrer Simulation zu erhalten.

Maximus Minimus
quelle
Enormer Dank für den Link. Bisher habe ich normalerweise den im Artikel beschriebenen "variablen Zeitschritt" -Ansatz verwendet.
Ivan Vučica
Der Ruhezustand ist auch auf Computern mit aktivierter Intel-Geschwindigkeitsstufe gefährlich.
waterwizard11
"aber es kann tatsächlich für eine beliebige Zeitspanne darüber schlafen." Nun, das muss bewiesen werden, denke ich ... Ich habe noch nie einen Beweis dafür gesehen, also denke ich, dass es eine dieser 'Definitionen' ist. Gute Antwort, und ja, Sie können keine Art von Schlaf verwenden, um eine feste Framerate einzustellen (auch wenn dies genau war).
Valmond
2
Per MSDN - "Beachten Sie, dass die sofortige Ausführung eines bereiten Threads nicht garantiert ist. Infolgedessen wird der Thread möglicherweise erst einige Zeit nach Ablauf des Ruheintervalls ausgeführt". Ich habe es zwar noch nie gesehen, aber wenn es als möglich dokumentiert ist, würde ich mich definitiv nicht darauf verlassen, dass es niemals passiert.
Maximus Minimus
1
Erwähnenswert, ich denke, dies würde sich beziehen auf "... wenn Sie die CPU-Auslastung reduzieren wollten ...": nanobit.net/doxy/quake3/win__main_8c-source.html <- relevanter Code beginnt bei 01224
user_123abc
16

Kurze Antwort: Nein, das ist es nicht.

Um eine feste Bildrate zu haben, müssen Sie eine bestimmte Rückruffunktion aufrufen, die eine bestimmte Bildrate erzwingt. Wenn Sie jetzt nicht wissen, wie lange eine einzelne Iteration in einer Schleife dauert, können Sie offensichtlich keine feste Ruhezeit festlegen.

GLUT bietet glutTimerFunc () . Wenn Sie in OpenGL programmieren, ist dies die richtige Funktion, die Sie benötigen. Schauen Sie sich dieses oder dieses Beispiel an .

Dan
quelle
1
"Nach mindestens Millisekunden ruft OpenGLUT einen Rückruf auf" - wie unterscheidet sich das von Sleep?
Kromster sagt Unterstützung Monica