Was ist der Unterschied zwischen Update und FixedUpdate in Unity und sollte ich mich darum kümmern?
10
Mir wurde gesagt, dass ich es Update()für Grafiken und FixedUpdate()für die Physik verwenden soll, aber manchmal werden meine Eingaben nicht registriert, wenn ich sie verwende FixedUpdate(). Es funktioniert gut, wenn ich Update()für alles benutze .
Soll ich mich darum kümmern FixedUpdate()oder mache ich etwas falsch?
FixedUpdatekann schneller oder langsamer laufen als Updateabhängig von Ihren Einstellungen. Dies hängt von der Last (wie schnell sie Updateläuft) und der Geschwindigkeit ab, die Sie eingestellt haben FixedUpdate(siehe Bearbeiten-> Projekteinstellungen-> Zeit). Da dies Updateeinmal pro Frame ausgeführt wird, möchten Sie im Idealfall hier Eingaben erfassen. Wenn Sie auf Eingaben in der FixedUpdateMethode reagieren müssen (z. B. die Steuerung von Physikkörpern), setzen Sie Flags in Updateund behandeln Sie sie in FixedUpdate:
Es ist immer noch eine gute Idee, die Physik von der FixedUpdateMethode aus zu steuern , da es unwahrscheinlich ist, dass die Physik so oft aktualisiert werden muss und die Physik bei einem festen Update viel einfacher vorherzusagen ist ( Determinismus ) als die Physik bei einem variablen Update.
Was ist, wenn wir anstelle einer Bool-Bedingung (es.GetMouseButtonDown) den Wert von einer Achse lesen müssen (Input.GetAxis ("Horizontal"))? Wenn das Update mehrmals als FixedUpdate ausgeführt wird, was raten Sie in diesem Fall? Sollten wir eventuell in Betracht ziehen, den Mittelwert der Achse zu berechnen, der während der verschiedenen Aktualisierungen aufgetreten ist, bevor wir sie in die Aktualisierung übernehmen? (+1 übrigens)
Heisenbug
Wie finde ich heraus, wie schnell mein FixedUpdate ist?
Tokamocha
1
@Tokamocha Die Rate für feste Updates wird unter Bearbeiten-> Projekteinstellungen-> Zeit eingestellt.
MichaelHouse
@ Heisenbug Persönlich würde ich nur den letzten Wert verwenden und sehen, wie gut das funktioniert. Wenn ich unerwartete Ergebnisse erhalte, berechne ich möglicherweise einen laufenden Durchschnitt des Achsenwerts, bis er von verarbeitet wird FixedUpdate. Das ist eines dieser Dinge, die einige Spieltests erfordern, um wirklich herauszufinden, was sich richtig "anfühlt".
MichaelHouse
1
Ich habe in jüngsten Tests festgestellt, dass im Gegensatz zu den Angaben in den Dokumenten bereits in FixedUpdate (zumindest auf dem PC) neue Eingabeflags verfügbar sind. Wenn Sie also in Update ein Flag setzen und danach im nächsten FixedUpdate darauf reagieren (dh im nächsten Frame), wie hier gezeigt, kann dies dem Spiel tatsächlich einen Latenzrahmen hinzufügen, relativ zur direkten Verarbeitung der Eingabe in FixedUpdate. Dies erfordert jedoch einige Sorgfalt , um zu vermeiden, dass Eingaben in Frames mit mehreren FixedUpdates doppelt verarbeitet werden oder Eingaben in Frames ohne FixedUpdate fehlen.
DMGregory
7
Sie müssen verstehen, was jeder tut. Update()wird so oft wie möglich aufgerufen (nicht sicher, vielleicht kann es begrenzt werden), egal wie - jeder Frame. FixedUpdate()wird jede konstante Zeitspanne aufgerufen (daher "fest").
Die Eingabe Update()erfolgt so einfach wie möglich (da FixedUpdate()das Eingabeereignis, wie Sie bemerkt haben, möglicherweise nicht erfasst wird). Die Spielelogik kann jedoch in beide gehen. Die Physik muss deterministisch sein und deshalb sollte es auch so sein FixedUpdate(). Andere Dinge müssen nicht. Je nach Nutzung müssen Sie entscheiden, welche Funktion geeignet ist.
Trotzdem ist es wert zu sagen, dass einige Anwendungen alle Spielelogik-Updates in FixedUpdate()(auch außerhalb von Unity) haben - es heißt "Fixed Step Game Loop". Wenn Sie den gesamten Aktualisierungscode in einer festen Schrittfunktion haben, erhalten Sie Determinismus und erhöhen die Wahrscheinlichkeit, dass sich Ihre App jedes Mal (und auf jedem Gerät) gleich verhält. Ermöglicht auch einige ausgefallene Funktionen wie Wiederholungen.
Wenn ich also alles in FixedUpdate () einfüge, registriert mein Spiel trotzdem alle Eingaben, oder?
Tokamocha
1
Nein, Sie können dort alle Aktualisierungen der Spielelogik ablegen, jedoch keine Eingabeprüfung.
NPS
2
Diese Antwort ist voll von Fehlinformationen. Zunächst wird FixedUpdate 1 / fixedDeltaTime mal pro Sekunde aufgerufen , nicht jede n: te fixedDeltaTime. Zweitens sollte die Spielelogik immer in FixedUpdate enthalten sein, da dies die Vernunft erleichtert. Das Update dient nur zum Rendern (ich weiß, dass fast niemand in der Unity-Community dem folgt, aber so soll es wirklich gemacht werden). Drittens hat FixedUpdate und seine Beziehung zur Physik-Engine nichts mit Determinismus zu tun.
FixedUpdate
. Das ist eines dieser Dinge, die einige Spieltests erfordern, um wirklich herauszufinden, was sich richtig "anfühlt".Sie müssen verstehen, was jeder tut.
Update()
wird so oft wie möglich aufgerufen (nicht sicher, vielleicht kann es begrenzt werden), egal wie - jeder Frame.FixedUpdate()
wird jede konstante Zeitspanne aufgerufen (daher "fest").Die Eingabe
Update()
erfolgt so einfach wie möglich (daFixedUpdate()
das Eingabeereignis, wie Sie bemerkt haben, möglicherweise nicht erfasst wird). Die Spielelogik kann jedoch in beide gehen. Die Physik muss deterministisch sein und deshalb sollte es auch so seinFixedUpdate()
. Andere Dinge müssen nicht. Je nach Nutzung müssen Sie entscheiden, welche Funktion geeignet ist.Trotzdem ist es wert zu sagen, dass einige Anwendungen alle Spielelogik-Updates in
FixedUpdate()
(auch außerhalb vonUnity
) haben - es heißt "Fixed Step Game Loop". Wenn Sie den gesamten Aktualisierungscode in einer festen Schrittfunktion haben, erhalten Sie Determinismus und erhöhen die Wahrscheinlichkeit, dass sich Ihre App jedes Mal (und auf jedem Gerät) gleich verhält. Ermöglicht auch einige ausgefallene Funktionen wie Wiederholungen.quelle