Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Behebung von Jitter, Stutter und Input-Lag

Was ist Jitter, Stutter und Input-Lag?

Jitter und Stutter sind zwei verschiedene Änderungen der sichtbaren Bewegung von Objekten auf dem Bildschirm, die sich auf ein Spiel auswirken können, selbst wenn sie mit voller Geschwindigkeit laufen. Diese Effekte sind vor allem in Spielen sichtbar, in denen sich die Welt mit konstanter Geschwindigkeit in eine feste Richtung bewegt, wie Runner oder Plattformer.

Der Input-Lag hat nichts mit Jitter und Stutter zu tun, wird aber manchmal zusammen mit ihnen diskutiert. Input-Lag bezieht sich auf die sichtbare Verzögerung auf dem Bildschirm bei der Ausführung von Aktionen mit der Maus, der Tastatur, dem Controller oder dem Touchscreen. Sie kann mit dem Spielcode, dem Enginecode oder externen Faktoren (wie der Hardware) zusammenhängen. Input-Lag macht sich vor allem in Spielen bemerkbar, bei denen die Maus zum Zielen verwendet wird, z.B. in Ego-Shootern. Input-Lag lässt sich zwar nicht vollständig beseitigen, aber auf verschiedene Weise reduzieren.

Unterscheidung zwischen Jitter und Stutter

Ein Spiel, das mit einer normalen Framerate läuft, ohne einen Effekt zu zeigen, erscheint flüssig:

../../_images/motion_normal.gif

Ein Spiel, das Jitter aufweist, wackelt ständig auf eine sehr subtile Weise:

../../_images/motion_jitter.gif

Schließlich erscheint ein Spiel mit Stutter flüssig, scheint jedoch alle paar Sekunden anzuhalten oder einen Frame zurückzusetzen:

../../_images/motion_stutter.gif

Jitter

Es kann viele Ursachen für Jitter geben. Die typischste tritt auf, wenn die Physikfrequenz des Spiels (normalerweise 60 Hz) mit einer anderen Auflösung als die Monitor-Aktualisierungsrate läuft. Überprüfen Sie, ob die Aktualisierungsrate Ihres Monitors eine andere als 60 Hz ist.

Dies ist in der Regel kein Problem, da die meisten Monitore mit 60 Hz arbeiten und mit Godot 3.1 ein Frame-Timer eingeführt wurde, der versucht, sich so gut wie möglich mit der Bildwiederholung zu synchronisieren.

Manchmal scheinen nur einige Objekte zu jittern (Charakter oder Hintergrund). Dies geschieht, wenn sie in verschiedenen Zeitquellen verarbeitet werden (eines wird im Physikschritt verarbeitet, ein anderes im Leerlaufschritt). Godot 3.1 hat hier einige Verbesserungen vorgenommen, angefangen bei der Möglichkeit, Kinematic Bodys in der regulären _process() Schleife zu animieren, bis hin zu weiteren Korrekturen im Frame-Timer.

Bemerkung

Sie können Physik-Interpolation verwenden, um physikalisch bedingtes Jittern zu mildern. Siehe lawnjelly's Smoothing-Add-on für ein Add-on, das in jedes Projekt eingefügt werden kann, um Physik-Interpolation zu aktivieren.

Stutter

Stottern kann aus zwei verschiedenen Gründen auftreten. Der erste und offensichtlichste Grund ist, dass das Spiel nicht in der Lage ist, die volle Framerate zu halten. Die Lösung dieses Problems ist spielspezifisch und erfordert eine Optimierung.

Die zweite ist komplizierter, da sie häufig nicht der Engine oder dem Spiel, sondern dem zugrunde liegenden Betriebssystem zugeordnet ist. Hier finden Sie einige Informationen zum Stutter auf verschiedenen Betriebssystemen.

Auf Plattformen, die Deaktivierung von V-Sync unterstützen, kann das Stuttering durch die Deaktivierung von V-Sync in den Projekteinstellungen reduziert werden. Dies führt jedoch zu Tearing, insbesondere auf Monitoren mit niedrigen Bildwiederholraten. Wenn Ihr Monitor dies unterstützt, sollten Sie die variable Bildwiederholfrequenz (G-Sync/FreeSync) aktivieren und V-Sync aktiviert lassen. Dadurch werden einige Formen des Stutterings gemildert, ohne dass es zu Tearing kommt.

Wenn Sie Ihre Grafikkarte zwingen, das maximale Performance-Profil zu verwenden, kann dies auch dazu beitragen, das Stuttering zu verringern, allerdings auf Kosten eines höheren Energieverbrauchs der GPU.

Windows

Es ist bekannt, dass Windows beim Spielen im Fenstermodus Stuttering verursacht. Dies hängt hauptsächlich von der installierten Hardware, der Treiberversion und den parallel ausgeführten Prozessen ab (z.B. kann das Öffnen vieler Browser-Tabs in einem laufenden Spiel zu Stuttering führen). Um dies zu vermeiden erhöht Godot ab 3.1 die Spielpriorität auf "Über Normal". Dies hilft erheblich, kann jedoch das Stuttering nicht vollständig beseitigen.

Um dies vollständig zu beseitigen, müssen Sie Ihrem Spiel die vollen Berechtigungen geben, um "zeitkritisch" zu werden, was nicht empfohlen wird. Einige Spiele können dies tun, es wird jedoch empfohlen mit diesem Problem zu leben, da dies bei Windows-Spielen üblich ist und die meisten Benutzer keine Spiele im Fenstermodus spielen (Spiele, die in einem Fenster gespielt werden, z.B. Puzzlespiele, zeigen dieses Problem normalerweise nicht).

Für den Vollbildmodus gibt Windows dem Spiel besondere Priorität, sodass Stuttering nicht mehr sichtbar und sehr selten ist. Die meisten Spiele werden so gespielt.

Tipp

Games should use the Exclusive Fullscreen window mode, as opposed to Fullscreen which is designed to prevent Windows from automatically treating the window as if it was exclusive fullscreen.

Fullscreen is meant to be used by GUI applications that want to use per-pixel transparency without a risk of having it disabled by the OS. It achieves this by leaving a 1-pixel line at the bottom of the screen. By contrast, Exclusive Fullscreen uses the actual screen size and allows Windows to reduce jitter and input lag for fullscreen games.

Linux

Stuttering kann unter Desktop-Linux sichtbar sein, aber das hängt in der Regel mit verschiedenen Videotreibern und Compositors zusammen. Einige Compositors können dieses Problem ebenfalls auslösen (z. B. KWin), so dass es ratsam ist, einen anderen Compositor zu verwenden, um ihn als Ursache auszuschließen. Bei einigen Fenstermanagern wie KWin und Xfwm können Sie das Compositing manuell deaktivieren, was die Performance verbessern kann (zum Preis von Tearing).

Es gibt keinen Workaround für Stuttering des Treibers oder des Compositors, es sei denn, Sie melden das Problem an die Entwickler des Treibers oder des Compositors. Das Stuttering kann bei der Wiedergabe im Fenstermodus stärker ausgeprägt sein als im Vollbildmodus, auch wenn das Compositing deaktiviert ist.

Feral GameMode kann verwendet werden, um automatisch Optimierungen (wie z.B. das Erzwingen des GPU-Performanceprofils) anzuwenden, wenn bestimmte Prozesse laufen.

macOS

Im Allgemeinen ist MacOS ruckelfrei, obwohl kürzlich einige Fehler beim Ausführen im Vollbildmodus gemeldet wurden (dies ist ein MacOS-Bug). Wenn Sie eine Maschine haben, die dieses Verhalten zeigt, teilen Sie uns dies bitte mit.

Android

Im Allgemeinen ist Android frei von Stuttering und Jittering, da die laufende Aktivität immer Vorrang hat. Es kann jedoch problematische Geräte geben (z.B. ältere Kindle Fire). Wenn Sie dieses Problem auf Android sehen, lassen Sie es uns bitte wissen.

iOS

iOS-Geräte sind im Allgemeinen Stuttering-frei, ältere Geräte, auf denen neuere Versionen des Betriebssystems ausgeführt werden, können jedoch Probleme aufweisen. Dies ist in der Regel unvermeidlich.

Input-Lag

Projektkonfiguration

Auf Plattformen, auf denen die Deaktivierung von V-Sync möglich ist, kann der Input-Lag durch die Deaktivierung von V-Sync in den Projekteinstellungen verringert werden. Dies führt jedoch zu Tearing, insbesondere bei Monitoren mit niedrigen Bildwiederholraten.

Eine Erhöhung der Anzahl der Physik-Iterationen pro Sekunde kann auch die durch die Physik verursachte Eingabe-Latenz verringern. Dies macht sich besonders bei der Verwendung von Physik-Interpolation bemerkbar (die zwar die Glätte verbessert, aber die Latenz erhöht). Um dies zu erreichen, setzen Sie Physik > Allgemein > Physik-Ticks Pro Sekunde auf einen höheren Wert als den Defaultwert 60, oder setzen Sie Engine.physics_ticks_per_second zur Laufzeit in einem Skript. Werte, die ein Vielfaches der Bildwiederholrate des Monitors sind (typischerweise 60), funktionieren am besten, wenn die Physik-Interpolation deaktiviert ist, da sie Jitter vermeiden. Das bedeutet, dass Werte wie 120, 180 und 240 gute Ausgangspunkte sind. Ein weiterer Vorteil ist, dass höhere FPS das Auftreten von Tunneling und Instabilitätsproblemen der Physik weniger wahrscheinlich machen.

Der Nachteil einer Erhöhung der Physik-FPS ist, dass die CPU-Auslastung steigt, was in Spielen mit umfangreichem Physiksimulationscode zu Performance-Engpässen führen kann. Dies kann dadurch gemildert werden, dass die Physik-FPS nur in Situationen erhöht wird, in denen eine niedrige Latenzzeit wichtig ist, oder dass die Spieler die Physik-FPS an ihre Hardware anpassen können. Allerdings führen unterschiedliche Physik-FPS zu unterschiedlichen Ergebnissen in der Physiksimulation, selbst wenn Delta konsequent in der Spiellogik verwendet wird. Dies kann bestimmten Spielern einen Vorteil gegenüber anderen verschaffen. Daher sollte es bei kompetitiven Multiplayer-Spielen vermieden werden, dem Spieler die Möglichkeit zu geben, die Physik-FPS selbst zu ändern.

Schließlich können Sie die Pufferung von Eingaben für jedes gerenderte Frame deaktivieren, indem Sie Input.set_use_accumulated_input(false) in einem Skript aufrufen. Dadurch werden die Funktionen _input() und _unhandled_input() in Ihren Skripten bei jeder Eingabe aufgerufen, anstatt Eingaben zu akkumulieren und darauf zu warten, daß ein Frame gerendert wird. Die Deaktivierung der Eingabeakkumulation erhöht die CPU-Auslastung, daher sollte sie mit Vorsicht durchgeführt werden.

Hardware/OS-spezifisch

Wenn Ihr Monitor dies unterstützt, sollten Sie die variable Bildwiederholfrequenz (G-Sync/FreeSync) aktivieren, während Sie V-Sync aktiviert lassen, und dann die Bildwiederholfrequenz in den Projekteinstellungen auf einen Wert begrenzen, der etwas unter der maximalen Bildwiederholfrequenz Ihres Monitors liegt (siehe diese Seite). Bei einem 144-Hz-Monitor können Sie zum Beispiel die Framerate des Projekts auf 141 einstellen. Dies mag auf den ersten Blick kontraintuitiv erscheinen, aber die Begrenzung der FPS unterhalb der maximalen Bildwiederholrate stellt sicher, dass das Betriebssystem nie auf das Ende der vertikalen Austastlücke warten muss. Dies führt zu einem ähnlichen Input-Lag wie bei deaktiviertem V-Sync mit der gleichen Frameraten-Begrenzung (normalerweise weniger als 1 ms länger), aber ohne Tearing.

Dies kann durch Änderung der Projekteinstellung Anwendung > Ausführen > Max FPS oder durch Zuweisung von Engine.max_fps zur Laufzeit in einem Skript geschehen.

Auf einigen Plattformen können Sie in den Optionen des Grafiktreibers (z.B. in der NVIDIA-Systemsteuerung unter Windows) auch einen Modus mit niedriger Latenz wählen. Mit der Einstellung Ultra erhalten Sie die geringstmögliche Latenz, allerdings auf Kosten einer etwas niedrigeren durchschnittlichen Framerate. Wenn Sie den Grafikprozessor zwingen, das maximale Performance-Profil zu verwenden, können Sie den Input-Lag noch weiter reduzieren, allerdings zum Preis eines höheren Stromverbrauchs (und der daraus resultierenden Wärme-/Lüftergeräusche).

Vergewissern Sie sich schließlich, dass Ihr Monitor in den Anzeigeeinstellungen des Betriebssystems mit der höchstmöglichen Bildwiederholfrequenz läuft.

Stellen Sie außerdem sicher, dass Ihre Maus so konfiguriert ist, dass sie die höchste Polling-Rate verwendet (in der Regel 1.000 Hz bei Gaming-Mäusen, manchmal auch mehr). Hohe USB-Polling-Raten können jedoch zu einer hohen CPU-Belastung führen, so dass 500 Hz auf Low-End-CPUs eine sichere Wahl sein kann. Wenn Ihre Maus mehrere DPI-Einstellungen bietet, sollten Sie auch die höchstmögliche Einstellung verwenden und die Empfindlichkeit im Spiel verringern, um die Mauslatenz zu reduzieren.

Unter Linux kann die Deaktivierung von Compositing in Fenstermanagern, die dies zulassen (wie KWin oder Xfwm), den Input-Lag erheblich reduzieren.

Melden von Problemen mit Jitter, Stutter oder Input-Lag

Wenn Sie Stuttering oder Jittering melden (eine Issue eröffnen), das nicht aus einem der oben genannten Gründe verursacht wurde, geben Sie bitte alle möglichen Informationen zu Gerät, Betriebssystem, Treiberversionen usw. sehr detailliert an. Dies kann zur besseren Fehlerbehebung beitragen.

Wenn Sie Probleme mit Input-Lag melden, fügen Sie bitte eine Aufnahme bei, die mit einer Hochgeschwindigkeitskamera gemacht wurde (z. B. mit dem Zeitlupenmodus Ihres Telefons). Bei der Aufnahme müssen sowohl der Bildschirm als auch das Eingabegerät sichtbar sein, damit die Anzahl der Bilder zwischen einer Eingabe und dem Ergebnis auf dem Bildschirm gezählt werden kann. Vergewissern Sie sich auch, dass Sie die Bildwiederholfrequenz Ihres Bildschirms und die Polling-Rate Ihres Eingabegeräts (insbesondere bei Mäusen) angeben.

Stellen Sie außerdem sicher, dass Sie den richtigen Begriff (Jitter, Stutter, Input-Lag) für das gezeigte Verhalten verwenden. Das hilft, Ihr Problem schneller zu verstehen. Geben Sie ein Projekt an, mit dem das Problem reproduziert werden kann, und fügen Sie, wenn möglich, eine Bildschirmaufnahme bei, die den Bug demonstriert.