Chrono in Unreal, Teil 5: Spuren, Gischt, Tropfen und der Preis der Bilder

Software Projekte Agentic Engineering

Die Physik in Teil 2 rechnet Kräfte, Einsinktiefen und Drehzahlen. Sichtbar wird davon zunächst nichts. Dieser Teil handelt von den einfachen Effekten, die die Zahlen ins Bild bringen: Spuren, Spritzer, Tropfen auf der Windschutzscheibe, der Aussenspiegel. Und von dem, was sie kosten, denn am Ende des Tages war die Bildrate das Thema, nicht die Physik. Die Reihe: Teil 1, Teil 3, Teil 4, Teil 6, Teil 7, Teil 8, Teil 9.

Die Demo, um die es in der Serie geht. Auf YouTube in 1080p ist die Konsole lesbar.

Die Regel

Jeder Effekt hängt an einer Grösse, die Chrono® ohnehin rechnet. Kein Partikelsystem läuft, weil das Auto fährt, sondern weil ein bestimmtes Rad mit einer bestimmten Laufflächengeschwindigkeit in einem bestimmten Boden steckt. Das macht die Effekte nicht schöner als ein gekauftes Partikelpaket, aber sie stimmen: ein durchdrehendes Rad spritzt im Stand, ein Rad im Wasser wirft Wasser, eines im Sand wirft Sand, und die Spur liegt dort, wo das Rad war.

Reifenspuren

Die Spuren sind Decals, alle 28 cm entlang des tatsächlichen Radwegs, pro Rad. Der Abstand kommt aus der zurückgelegten Strecke des Rades, nicht aus der Zeit, damit die Spur bei jedem Tempo lückenlos ist und ein Kreis über die eigene Spur sauber kreuzt. Nach 120 Sekunden werden die ältesten verworfen. Das war zuerst 300, und die Menge an Decals im Bild war einer der Posten, die die Bildrate drückten.

Was die Spuren nicht zeigen: die Verformung selbst. Das Soil Contact Model kennt die Einsinktiefe jedes Bodenknotens, und man könnte daraus die Furche als Geometrie bauen. Das steht auf der Liste und wäre der ehrlichere Effekt, weil er die Physik zeigt statt sie zu zeichnen.

Spuren von oben: alle 28 cm ein Decal pro Rad, lückenlos bei jedem Tempo

Gischt und Sand

Spritzer sind Instanced Meshes, kleine Tropfen von 3.5 bis 9 cm, bis zu einigen tausend gleichzeitig. Pro Rad wird eine Rate aus der Laufflächengeschwindigkeit bestimmt, ein Rad, das dreht, spritzt also auch, wenn das Auto steht. Die Stärke hängt vom Boden unter dem Rad ab: im Wasser voll, auf nassem Sand ein Drittel, auf trockenem Sand als Staub, und dort mehr, je tiefer das Rad einsinkt.

Die Richtung folgt der Lauffläche: rollt das Rad vorwärts, geht der Spritzer leicht nach vorn, im Rückwärtsgang leicht nach hinten. Ein Teil der Tropfen von den Vorderrädern geht bei Vorwärtsfahrt über die Haube. Alle fliegen auf Parabeln mit der Schwerkraft. Beim Eintauchen nach dem Sprung gibt es zusätzlich einen Schwall, ausgelöst auf der Flanke, wenn ein Vorderrad mit mehr als 8 m/s ins Wasser kommt.

Ein Detail, das ein Rad tief unter der Oberfläche betrifft: es spritzt nicht. Ein Reifen 55 cm unter dem Wasserspiegel wirft keine Gischt an die Oberfläche, und das Fahrzeug, das mit drehenden Rädern schwimmt, sieht sonst aus wie ein Springbrunnen.

Notbremsung: Sand an den blockierenden Rädern, nach vorn geworfen

Tropfen auf der Windschutzscheibe

Die Fahrersicht ist ein Rendertarget, das das HUD als Bild einblendet. Die Tropfen werden darüber gezeichnet, und zwar nur dann, wenn ein Vorderrad im Wasser läuft, mehr auf der Seite dieses Rades. Sie sitzen still, wo sie gelandet sind, und verblassen nach zweieinhalb bis fünf Sekunden. Kein Ablaufen mit Schwerkraft und Fahrtwind, das wurde probiert und wieder abgeschaltet: in der Grösse, in der man das Ablaufen sieht, sehen die Tropfen aus wie Kugeln, und ein Tropfen auf Glas ist keine Kugel, sondern eine flache Benetzung.

Der optische Effekt ist der Punkt: ein Tropfen ist eine Linse. Ein Material zeigt in jedem Tropfen die Fahrersicht dahinter verkleinert und gespiegelt, mit einem dünnen hellen Rand, und der Rest der Scheibe bleibt klar. Das Material bekommt das Rendertarget und pro Tropfen den Ausschnitt, den die Linse abbildet.

Und hier kam die Rechnung: jeder Linsentropfen ist ein eigener Materialaufruf mit eigener Materialinstanz, rund 50 Mikrosekunden auf dem Spielthread. Bei 400 Tropfen sind das 20 Millisekunden, und die Wasserphasen fielen auf 24 Bilder pro Sekunde, während die Grafikkarte bei 12 ms lag. Jetzt bekommen nur die grossen Tropfen die Linse, höchstens hundert, die kleinen eine flache Textur, die die Engine gebündelt zeichnet. Bei drei bis sechs Pixeln sieht man den Unterschied nicht.

Fahrersicht im Spülsaum: Tropfen auf der Scheibe, rechts die Gischt des Vorderrades

Der Aussenspiegel

Ein Spiegel in dieser Engine ist keine Reflexion, sondern eine eigene Kamera: eine Scene Capture Komponente rendert die Szene ein weiteres Mal in ein Rendertarget auf einer Fläche am Fahrzeug, mit Landschaft, Vegetation, Wasser, Spritzern, Schatten. Reflexionen aus dem Bildschirmraum reichen nicht, weil das Spiegelbild hinter der Kamera liegt und damit im Bild fehlt.

Der Split Screen hatte schon drei Ansichten: Hauptkamera, Fahrersicht, Drohne. Eine vierte für einen Aussenspiegel hätte zu viel Zeit gekostet, um die Bildrate konstant über 60 zu halten, also ist der Spiegel weg. Die zwei Zusatzansichten, die geblieben sind, laufen bereits reduziert: ohne globale Beleuchtung, ohne Reflexionen, ohne Nebel, die Fahrersicht nur jedes zweite Bild.

Das Cockpit ohne Aussenspiegel, die Düne voraus

Die Küstenlinie

Das Meer war zuerst ein Wellengitter vor dem Nordstrand und dahinter eine flache Ebene. Im Video sah man drei Zonen: das bewegte Wasser, dann ein dunkleres Band, dann Himmel, “man sieht das Ende der Welt”. Das Band war die Spiegelung der flachen Ebene, die keine Normalen hat. Jetzt gibt es zwei Gitter: das nahe mit 166 mal 101 Punkten auf 2 Meter Raster über 330 mal 200 Meter, jedes Bild neu gesetzt, und ein grobes mit 12 Meter Raster bis 1.5 Kilometer hinaus, nur jedes zweite Bild aktualisiert, weil niemand 30 Hz auf Wellen in 200 Metern sieht. Die Normalen kommen analytisch aus der Wellenfunktion, nicht aus Nachbardifferenzen. Das nahe Rechteck ist auf das Raster des groben eingerastet, sonst bleibt ein Streifen Sand zwischen den beiden, und die flache Ebene lässt das Rechteck des groben Gitters aus, sonst liegen zwei transparente Flächen übereinander. Unter allem eine Bodenplatte fünf Meter tief, damit das Wasser jenseits der Insel eine Farbe hat.

Das Licht der Nacht, Belichtung, Mond, Sterne und die Lichter des Bootes, hat einen eigenen Teil, Teil 8, Teil 9.

Was es kostet

Die Messung läuft über eine Logzeile pro Sekunde mit mittlerer und maximaler Bildzeit, GPU Zeit und Chrono Zeit. Die Zwischenstände sind am Nordstrand gemessen, die beiden Zeilen zum Stand der Demo sind Mittelwerte aus dem Log des gezeigten Laufs, 1920 mal 1080, Ryzen® 5 7600 und GeForce RTX® 5070.

KonfigurationGPU pro BildChrono pro BildBildrate
Ausgangslage mit Lumen, Spiegel, drei Zusatzansichten24 ms8 bis 12 ms30 bis 40
Ohne Lumen, Reflexionen aus dem Bildschirmraum17 ms8 bis 12 ms50
Ohne die drei Zusatzansichten16 ms8 bis 12 ms60
Stand der Demo, Parcours und Düne12 ms13 ms57
Stand der Demo, Nordstrand und Wasser13 ms14 bis 15 ms48 bis 51
400 Linsentropfen mit eigenem Materialaufruf12 ms18 ms24

Drei Dinge fallen auf. Erstens ist Chrono auf der CPU mit 12 bis 15 ms pro Bild, also neun Teilschritten von 2 ms bei 54 Bildern pro Sekunde, nie das Problem gewesen und wurde nie angefasst. Zweitens ist jede Ansicht eine ganze Szene: die drei Zusatzansichten kosteten zusammen rund 8 ms, bevor sie reduziert wurden, mehr als die Physik. Drittens kann ein Effekt, der auf der Grafikkarte nichts kostet, den Spielthread stellen, wie die Tropfen. Die Bildzeit allein sagt dann nicht, wo es klemmt, erst der Vergleich von GPU Zeit, Chrono Zeit und Rest.

Die Zeile mit den 18 ms Chrono in der letzten Konfiguration ist auch eine Lehre: Chrono war nicht langsamer geworden, es hatte mehr zu tun. Ein Bild von 42 ms braucht 17 Teilschritte statt acht, damit die Physik mit der Uhr Schritt hält, und so verdoppelt ein Effekt auf dem Spielthread die Physikzeit gleich mit. Die Physikzeit pro Bild ist eine Folge der Bildzeit, nicht nur eine Ursache.

Die Zusatzansicht der Drohne: eine ganze Szene mehr pro Bild

Was den Schirm über dem Boot als Modell trägt, mit Leine, Pilot und Wind, zeigt Teil 6.

Schlüsselwörter: Unreal Engine Reifenspuren Decals, Gischt Instanced Meshes, Tropfen Windschutzscheibe Material, Scene Capture Spiegel Kosten, Render Target Performance, Unreal Engine 5.8 Leistung, Fahrzeugsimulation Effekte, Serious Gaming, Simulation Beratung Schweiz, swissEmbedded

Effekte, die zur Physik passen, und eine Bildrate, die hält? Wir bauen Visualisierungen, die aus Simulationsgrössen entstehen, und messen, was sie kosten, bevor es jemand sieht.

Kontaktieren Sie uns →

Unreal® und Unreal Engine® sind Marken oder eingetragene Marken von Epic Games, Inc. in den USA und anderswo; diese Artikel sind von Epic Games weder unterstützt noch geprüft. Project Chrono ist ein Open-Source-Projekt der University of Wisconsin-Madison und des Politecnico di Milano unter BSD-3-Lizenz.