Respekt, dass es auf einer ganzen Plattform lief! Ich höre ständig Gerüchte darüber, dass es „höchstens auf dem selben System“ reproduzierbar wäre, wie etwa in diesem grottenschlechten Artikel. Spieleentwickler müssen sich natürlich an die Trennung von Update() und FixedUpdate() halten, aber welche Probleme Unity intern hat, weiß ich nicht. Falls es dazu Entwicklerkommentare gibt, würde ich die gern lesen 👀TomasRiker hat geschrieben: ↑13.05.2024, 10:42Ich habe selbst mal versucht Unity-Physik deterministisch hinzukriegen. Mit viel Mühe habe ich es innerhalb von einer Plattform geschafft, aber plattformübergreifend war es ein aussichtsloses Unterfangen.
————
Upps – ich vergaß, dass mir aus (zu recht!) dieses Video ans Herz gelegt worden war:Alexander Kornrumpf hat geschrieben: ↑13.05.2024, 07:40Vor 20 Jahren (oh shit!) war das hier der Goldstandard: https://gafferongames.com/post/fix_your_timestep/
————
Ich lese „Ich habe keine Ahnung, was meine Software tut. Deshalb ist es nicht einfach, Software zu entwickeln, die tut, was man möchte.“Jonathan hat geschrieben: ↑13.05.2024, 14:01Hm, ja, ich folgere daraus mal, dass es tatsächlich nicht einfach ist.
Ich habe ehrlich gesagt keine Ahnung, ob ich z.B. Fast-Math aktiviert habe. Oder wie das in all meinen Abhängigkeiten aussieht. Oder welche Flags wo und wann aktiviert sind und von welcher Abhängigkeit.
Man kann mit nicht-deterministischer Physik weit kommen; hängt halt vom Anwendungsfall ab. Deterministische Physik ist aber keinesfalls unmöglich. Half-Life, Quake – die waren alle deterministisch (siehe Demos/Replays im DEM-Format). Die Engine spielt einfach einen Strom Ereignisse ab; egal, ob die aus der lokalen GUI oder von einem Server kommen. Muss aber in Vergessenheit geraten sein, denn so etwas wird heute ja mitunter als Errungenschaft von Entity-Component-Systemen verkauft.
Replays von deterministischer Physik eignen sich übrigens perfekt als Tests. Du kannst ziemlich hohe Testabdeckung erreichen, indem du literally für ein paar Sekunden die Record-Taste hälst, nach jedem Build ein Replay laufen lässt, und schließlich prüfst, ob die Objektpositionen die selben sind 🤷
Ich gehe nicht auf die Details ein, weil die sich bisher immer als irrelevant herausgestellt haben. Du lässt deine Simulation natürlich nicht mit VSync-Frequenz laufen, sondern mit einer festen Frequenz, die höher ist – optimalerweise der GGT beliebter Frame-Intervalle. Ich nutze gerade 144 Hz; früher mal 240. Autorennspiele laufen intern gern mit 200–1000 Hz (Wikipedia hatte dazu mal eine tolle Tabelle). Interpolieren/Extrapolieren kann man, aber ich habe noch nicht gehört, dass sich jemand wirklich dazu gezwungen sah – außer Soapy in ReDRIVER2, dessen Physik mit 50 Hz lief (weil PlayStation 1!) und das auf 60-Hz-Bildschirmen leicht unrund aussah. Wenn du mit 120 Hz rechnest, wird das auch ohne Interpolation auf jedem gängigen Monitor (60 Hz, 80 Hz, 120 Hz) flüssig aussehen.VSYNC ist eine guter Punkt
Ja; zwei/drei Implementierungen, die mir bekannt sind, speichern bei VSync einen Snapshot der aktuellen Szene. Ist durchaus nervig, beschwert mitunter aber auch Synergieeffekte mit Dingen wie Multi-Threaded Rendering.Ein Objekt kann dann nicht mehr mit seiner aktuellen Position aus der Spiellogik gerendert werden, sondern es muss eine extra Renderposition berechnet werden. […] dann braucht man auch mindestens mal alle Variablen doppelt und muss auch immer einen extra Update-Schritt machen, und irgendwo zwischenspeichern. Für alles, was irgendwo irgendwie angezeigt wird. Klingt super nervig.
Ich selber tue das übrigens nicht. Ich unterbreche die Physik-Berechnung, sobald ein Frame angezeigt werden muss, und hole nach dem Rendern wieder auf. Fühlt sich ein wenig schmutzig an; ändere ich wahrscheinlich, sobald ich Multiplayer realisieren muss.
Ich möchte niemandem was vorschreiben und labere hier nur, weil ich das Thema gern diskutiere. Gute Spiele kann man mit Determinismus bauen oder ohne. Aber Aussagen wie, Floats wären grundsätzlich ungenau oder man könnte sie nicht über Plattformen hinweg konsistent nutzen, kann ich nicht stehen lassen.