Ruby Schlaf oder Verzögerung weniger als eine Sekunde?


149

Ich mache ein Skript mit Ruby, das Frames mit 24 Frames pro Sekunde rendern muss, aber ich muss 1/24 Sekunde zwischen dem Senden der Befehle warten. Was ist der beste Weg, um weniger als eine Sekunde zu schlafen?

Antworten:


202
sleep(1.0/24.0)

Zu Ihrer Folgefrage, ob dies der beste Weg ist: Nein, Sie könnten nicht so glatte Frameraten erhalten, da das Rendern jedes Frames möglicherweise nicht die gleiche Zeit in Anspruch nimmt.

Sie können eine dieser Lösungen ausprobieren:

  • Verwenden Sie einen Timer, der 24 Mal pro Sekunde mit dem Zeichnungscode ausgelöst wird.
  • Erstellen Sie so viele Frames wie möglich. Erstellen Sie die Bewegung basierend auf der verstrichenen Zeit und nicht pro Frame.

14
@Funkodebat Ich bin mir ziemlich sicher, dass jede grundlegende Ruby-Laufzeit dies für Sie erledigt.
Georg Schölly

2
@JosephSilvashy: Ich habe keinen Einblick in den Ruby-Interpreter, aber Ruby MRI macht standardmäßig keine Memoisierung. Ich hoffe jedoch, dass diese Art der Optimierung durchgeführt wird, während der Quellcode in Bytecode konvertiert wird.
Georg Schölly

8
Es ist eine gute Idee, den Wert 1.0 / 24.0 für das DRY-Prinzip in eine Variable zu extrahieren. Andere Codeteile benötigen diesen Wert ebenfalls. Sie sollten ihn daher an einem zentralen Ort aufbewahren, um Doppelarbeit zu vermeiden. Wenn Leistung ein Nebeneffekt ist, dann großartig!
James Watkins

1
Sie sollten auf jeden Fall die Konstante extrahieren und es definitiv nicht mit dem Grund "all die Leistung, die Sie bekommen können" tun
Blake

4
Aber es ist eine schnelle Unterteilung, die einmal pro Frame ausgeführt wird. Hoffentlich ist das Rendern des Rahmens selbst um eine Größenordnung rechenintensiver. Dies ist ein hervorragendes Beispiel für vorzeitige Optimierung.
Alan H.

101

Pass Float in den Schlaf, wie sleep 0.1

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.