Up to date

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

Große-Welt-Koordinaten

Bemerkung

Große-Welt-Koordinaten sind hauptsächlich in 3D-Projekten nützlich; in 2D-Projekten sind sie selten erforderlich. Außerdem profitiert das 2D-Rendering im Gegensatz zum 3D-Rendering derzeit nicht von einer erhöhten Präzision, wenn Große-Welt-Koordinaten aktiviert sind.

Warum Große-Welt-Koordinaten verwenden?

In Godot basieren sowohl die Physiksimulation als auch das Rendering auf Gleitkommazahlen. In der Informatik haben Gleitkommazahlen jedoch eine begrenzte Genauigkeit und einen begrenzten Wertebereich. Dies kann ein Problem für Spiele mit riesigen Welten sein, wie z.B. Weltraumspiele oder Spiele auf einer planetaren Skala.

Die Präzision ist am größten, wenn der Wert nahe bei 0,0 liegt. Die Präzision wird allmählich geringer, wenn der Wert von 0.0 positiv oder negativ entfernt. Dies geschieht jedes Mal, wenn der Exponent der Gleitkommazahl ansteigt, d.h. wenn die Gleitkommazahl eine Potenz von 2 überschreitet (2, 4, 8, 16, ...). Jedes Mal, wenn dies geschieht, erhöht sich die Mindestschrittweite der Zahl, was zu einem Verlust an Präzision führt.

In der Praxis bedeutet dies, dass die Präzision abnimmt, je weiter sich der Spieler vom Ursprung der Welt (Vektor2(0, 0) in 2D-Spielen oder Vektor3(0, 0, 0) in 3D-Spielen) entfernt.

Dieser Präzisionsverlust kann dazu führen, dass Objekte zu "vibrieren" scheinen, wenn sie weit vom Ursprung der Welt entfernt sind, da die Position des Modells auf den nächstgelegenen Wert einrastet, der in einer Gleitkommazahl dargestellt werden kann. Dies kann auch zu Physikstörungen führen, die nur auftreten, wenn der Spieler weit vom Ursprung der Welt entfernt ist.

Der Wertebereich bestimmt die Mindest- und Höchstwerte, die in der Zahl gespeichert werden können. Wenn der Spieler versucht, diesen Bereich zu überschreiten, kann er dies nicht tun. In der Praxis wird die Gleitkommagenauigkeit jedoch fast immer zum Problem, bevor es der Wertebereich wird.

Der Wertebereich und die Präzision (Mindestschrittweite zwischen zwei Exponentenintervallen) werden durch den Typ der Gleitkommazahl bestimmt. Der theoretische Bereich erlaubt es, extrem hohe Werte in Single-Precision-Gleitkommazahlen zu speichern, allerdings mit einer sehr geringen Präzision. In der Praxis ist ein Gleitkommatyp, der nicht alle ganzzahligen Werte darstellen kann, nicht sehr nützlich. Bei extremen Werten wird die Präzision so gering, dass die Zahl nicht einmal zwei separate ganzzahlige Werte voneinander unterscheiden kann.

Dies ist der Wertebereich, in dem einzelne Ganzzahlwerte in einer Gleitkommazahl dargestellt werden können:

  • Single-Precision-Gleitkomma-Wertebereich (stellt alle ganzen Zahlen dar): Zwischen -16.777.216 und 16.777.216

  • Double-Precision-Gleitkomma-Wertebereich (stellt alle ganzen Zahlen dar): Zwischen -9 Billiarden und 9 Billiarden

Wertebereich

Single-Precision-Schrittweite

Double-Precision-Schrittweite

Kommentar

[1; 2]

~0.0000001

~1e-15

Die Präzision wird in der Nähe von 0,0 größer (diese Tabelle ist abgekürzt).

[2; 4]

~0.0000002

~1e-15

[4; 8]

~0.0000005

~1e-15

[8; 16]

~0.000001

~1e-14

[16; 32]

~0.000002

~1e-14

[32; 64]

~0.000004

~1e-14

[64; 128]

~0.000008

~1e-13

[128; 256]

~0.000015

~1e-13

[256; 512]

~0.00003

~1e-13

[512; 1024]

~0.00006

~1e-12

[1024; 2048]

~0.0001

~1e-12

[2048; 4096]

~0.0002

~1e-12

Maximaler empfohlener Single-Precision-Wertebereich für ein First-Person-3D-Spiel ohne Rendering-Artefakte oder Physik-Glitches.

[4096; 8192]

~0.0005

~1e-12

Maximaler empfohlener Single-Precision-Wertebereich für ein Third-Person-3D-Spiel ohne Rendering-Artefakte oder Physik-Glitches.

[8192; 16384]

~0.001

~1e-12

[16384; 32768]

~0.0019

~1e-11

Maximaler empfohlener Single-Precision-Wertebereich für ein Top-Down-3D-Spiel ohne Rendering-Artefakte oder Physik-Glitches.

[32768; 65536]

~0.0039

~1e-11

Maximaler empfohlener Single-Precision-Wertebereich für jedes 3D-Spiel. Double-Precision (Große-Welt-Koordinaten) ist in der Regel über diesen Punkt hinaus erforderlich.

[65536; 131072]

~0.0078

~1e-11

[131072; 262144]

~0.0156

~1e-10

> 262144

> ~0.0313

~1e-10 (0.0000000001)

Die Double-Precision bleibt weitaus präziser als die Single-Precision über diesen Wert hinaus.

Bei der Verwendung von Single-Precision-Gleitkommazahlen ist es möglich, die vorgeschlagenen Wertebereiche zu überschreiten, aber es treten mehr sichtbare Artefakte auf und es kommt häufiger zu Physikstörungen (z. B. läuft der Spieler nicht gerade in bestimmte Richtungen).

Siehe auch

Weitere Informationen finden Sie im Artikel Entmystifizierung der Gleitkommapräzision.

Wie Große-Welt-Koordinaten funktionieren

Große-Welt-Koordinaten (auch bekannt als Double Precision-Physik) erhöhen die Präzision aller Gleitkommaberechnungen innerhalb der Engine.

Standardmäßig ist float in GDScript 64-bit, aber Vector2, Vector3 und Vector4 sind 32-bit. Das bedeutet, dass die Präzision von Vektortypen viel stärker eingeschränkt ist. Dies führt zu einer exponentiellen Steigerung der Präzision, d.h. der endgültige Wert ist nicht nur doppelt so genau, sondern bei hohen Werten potenziell tausendmal genauer. Auch der darstellbare Maximalwert wird durch den Wechsel von einer Single-Precision Gleitkommazahl zu einer Double-Precision Gleitkommazahl erheblich gesteigert.

Um Probleme mit dem Einrasten des Modells zu vermeiden, wenn es sich weit vom Ursprung der Welt entfernt befindet, erhöht die 3D-Rendering-Engine von Godot ihre Präzision für Rendering-Operationen, wenn Große-Welt-Koordinaten aktiviert sind. Die Shader verwenden aus Performance-Gründen keine Double-Precision-Gleitkommazahlen, aber eine alternative Lösung wird verwendet, um Double-Precision für das Rendering mit Single-Precision-Gleitkommazahlen zu emulieren.

Bemerkung

Die Aktivierung von Große-Welt-Koordinaten geht zu Lasten der Performance und der Speichernutzung, insbesondere auf 32-Bit-CPUs. Aktivieren Sie Große-Welt-Koordinaten nur, wenn Sie sie tatsächlich benötigen.

Dieses Feature ist auf Mittelklasse/High-End-Desktop-Plattformen zugeschnitten. Große-Welt-Koordinaten sind auf Low-End-Mobilgeräten möglicherweise nicht sehr performant, es sei denn, Sie ergreifen Maßnahmen, um die CPU-Auslastung mit anderen Mitteln zu reduzieren (z.B. durch Verringerung der Anzahl der Physik-Ticks pro Sekunde).

Auf Low-End-Plattformen kann stattdessen ein Origin-Shifting-Ansatz verwendet werden, um große Welten zu ermöglichen, ohne Physik und Rendering mit doppelter Genauigkeit zu verwenden. Origin Shifting funktioniert mit einfach präzisen Fließkommazahlen, führt aber zu mehr Komplexität in der Spiellogik, insbesondere bei Multiplayer-Spielen. Daher wird das Origin-Shifting auf dieser Seite nicht näher erläutert.

Für wen sind Große-Welt-Koordinaten gedacht?

Große-Welt-Koordinaten werden in der Regel für 3D-Weltraum- oder Planetensimulationsspiele benötigt. Dies gilt auch für Spiele, die sehr schnelle, aber auch sehr langsame und präzise Bewegungen unterstützen müssen.

Andererseits ist es wichtig, Große-Welt-Koordinaten nur dann zu verwenden, wenn sie tatsächlich benötigt werden (aus Performance-Gründen). Große-Welt-Koordinaten sind normalerweise nicht erforderlich für:

  • 2D-Spiele, da Präzisionsprobleme in der Regel weniger auffällig sind.

  • Spiele mit kleinen oder mittelgroßen Welten.

  • Spiele mit großen Welten, die jedoch in verschiedene Ebenen mit dazwischen liegenden Ladesequenzen aufgeteilt sind. Sie können jeden Level-Teil um den Ursprung der Welt zentrieren, um Präzisionsprobleme zu vermeiden, ohne dass die Performance darunter leidet.

  • Open-World-Spiele mit einer spielbaren begehbaren Fläche, die 8192×8192 Meter nicht überschreitet (zentriert um den Ursprung der Welt).

Im Zweifelsfall müssen Sie wahrscheinlich keine Große-Welt-Koordinaten in Ihrem Projekt verwenden. Als Referenz: Die meisten modernen AAA-Open-World-Titel verwenden kein Große-Welt-Koordinaten-System und verlassen sich sowohl beim Rendering als auch bei der Physik immer noch auf Single-Precision Gleitkommazahlen.

Aktivieren von Große-Welt-Koordinaten

Dieser Prozess erfordert eine Neukompilierung des Editors und aller Exportvorlagen-Binärdateien, die Sie verwenden möchten. Wenn Sie Ihr Projekt nur im Release-Modus exportieren möchten, können Sie die Kompilierung der Debug-Exportvorlagen auslassen. In jedem Fall müssen Sie einen Editor-Build kompilieren, damit Sie Ihre Hohe-Präzisions-Welt testen können, ohne das Projekt jedes Mal exportieren zu müssen.

Siehe den Kompilieren Abschnitt für Kompilieranweisungen für jede Target-Plattform. Sie müssen die SCons-Option precision=double hinzufügen, wenn Sie den Editor und die Exportvorlagen kompilieren.

Die resultierenden Binärdateien werden mit dem Suffix .double benannt, um sie von den Single-Precision-Binärdateien (die kein Präzisionssuffix haben) zu unterscheiden. Sie können die Binärdateien dann als benutzerdefinierte Exportvorlagen in den Exportvoreinstellungen Ihres Projekts im Dialogfeld "Export" angeben.

Kompatibilität zwischen Single-Precision und Double-Precision-Builds

Wenn eine binäre Ressource mit dem Singleton ResourceSaver gespeichert wird, wird ein spezielles Flag in der Datei gespeichert, wenn die Ressource mit einem Build gespeichert wurde, der Double-Precision-Zahlen verwendet. Infolgedessen ändern sich alle binären Ressourcen auf der Festplatte, wenn Sie zu einem Double-Precision-Build wechseln und über sie speichern.

Sowohl Single-Precision- als auch Double-Precision-Builds unterstützen die Verwendung des Singletons ResourceLoader für Ressourcen, die dieses spezielle Flag verwenden. Das bedeutet, dass Single-Precision-Builds Ressourcen laden können, die mit Double-Precision-Builds gespeichert wurden und umgekehrt. Textbasierte Ressourcen speichern kein Double-Precision-Flag, da sie ein solches Flag zum korrekten Lesen nicht benötigen.

Bekannte Inkompatibilitäten

  • In einem Netzwerk-Multiplayer-Spiel sollten der Server und alle Clients denselben Build-Typ verwenden, um sicherzustellen, dass die Präzision auf allen Clients gleich bleibt. Die Verwendung unterschiedlicher Build-Typen kann funktionieren, aber es können verschiedene Probleme auftreten.

  • Die GDExtension-API ändert sich auf inkompatible Weise in Double-Precision-Builds. Das bedeutet, dass Extensions neu gebaut werden müssen, um mit Double-Precision-Builds zu funktionieren. Auf der Seite des Erweiterungsentwicklers wird das REAL_T_IS_DOUBLE-Define aktiviert, wenn eine GDExtension mit precision=double gebaut wird. real_t kann als Alias für float in Single-Precision-Builds und double in Double-Precision-Builds verwendet werden.

Einschränkungen

Da 3D-Rendering-Shader keine Double Precision-Gleitkommazahlen verwenden, gibt es einige Einschränkungen bei der 3D-Rendering-Präzision:

  • Shader, die skip_vertex_transform oder world_vertex_coords benutzen, profitieren nicht von der erhöhten Präzision.

  • Triplanares Mapping profitiert nicht von erhöhter Präzision. Materialien, die triplanares Mapping verwenden, zeigen ein sichtbares Jittern, wenn sie weit vom Weltursprung entfernt sind.

Das 2D-Rendering profitiert derzeit nicht von der erhöhten Präzision, wenn Große-Welt-Koordinaten aktiviert sind. Dies kann dazu führen, dass das Modell sichtbar einrastet, wenn es weit vom Weltursprung entfernt ist (ab einigen Millionen Pixeln bei typischen Zoomstufen). Die 2D-Physikberechnungen profitieren jedoch von der erhöhten Präzision.