Das Problem mit dem Präzisionsverlust und der Größe der Spielwelt

  • Ich würde mit dieser Diskussion gerne ein technisches Problem ansprechen, was meiner Meinung nach kaum Beachtung findet und einen enormen Qualitätsmangel darstellt, der die Zukunft von Rising World gefährden könnte. Es geht nämlich um den Präzisionverlust bei größeren Koordinaten und somit die „sinnvoll bespielbare“ Größe einer generierten Welt.


    Nach einiger Spielzeit ist mir aufgefallen, dass die Hände meiner Spielfigur leicht wackeln, bspw. wenn sie eine Spitzhacke in der Hand hält. Zuerst ist dieses Wackeln kaum wahrnehmbar und ich habe es auch manchmal nur für „frieren“ gehalten, aber wenn man eine größere Reise gemacht hat und in Koordinatenbereichen ab 10.000 unterwegs ist, merkt man immer deutlicher, dass die Spielfigur heftiger wackelt. Gleichzeitig kommt ein größeres Problem hinzu: Abmessungen von Bauwerken sowie Texturen werden immer ungenauer und das bereits nach einer nicht zu großen Entfernung zum Spawn :!:


    Um das Beispiel mit der Ungenauigkeit zu demonstrieren, habe ich ein paar Screenshots gemacht.


    Bauwerk in der Nähe vom Spawn d. h. in der Nähe der Koordinaten (0 0 0), Sektor (0 0):

    Bauwerk in der Nähe von (9000 100 15000), Sektor (1 1):

    Bauwerk in der Nähe von (12000 100 29000), Sektor (1 3):


    Auf den Bildern wird schnell erkennbar, dass die Texuren jedes Mal verwaschener werden und Bauteile nicht mehr ganz glatt ineinander übergehen, es entstehen ungewollt Fugen.


    Falls sich jetzt jemand fragt, was mit den „Sektoren“ gemeint ist: Die Welt ist in 8192×8192 große Abschnitte eingeteilt, die Sektoren genannt werden und quasi Inselgruppen in der Weltgenerierung voneinander trennen, d. h. es ist immer ein Ozean zwischen den Landmassen der einzelnen Sektoren.

    Sektoren sind nach folgendem Schema auf der Weltkarte angelegt:

    -2 3
    -1 3
    0 3
    1 3
    2 3
    -2 2
    -1 2
    0 2
    1 2
    2 2
    -2 1
    -1 1
    0 1
    1 1
    2 1
    -2 0
    -1 0
    0 0
    1 0
    2 0
    -2 -1
    -1 -1
    0 -1
    1 -1
    2 -1


    Ich benutze Sektoren hier als ungefähre Größe, um zu zeigen, wo ich mich grob in der Welt befinde, damit man hoffentlich eine Vorstellung bekommt, dass auch schon eine relativ kurze Reise auf die „nächste Insel“, bereits in ein Gebiet führt, was mit Präzisionsproblemen behaftet ist. Das ist leider ein fundamentales Problem für das Bauen und Erkunden in Rising World, da Spielwelten ab Sektoren mit Werten über 1 bzw. -1 einfach zu „fragil“ werden und die scheinbar unendliche (natürlich hat diese seine technischen Grenzen) Welt deutlich schneller die „Nutzbarkeit/Schönheit“ verliert.


    Falls jemand noch skeptisch ist, rate ich einfach mal selbst mit dem Befehl tp <x> <y> <z> zu verschiedenen Koordinaten zu springen und sich selbst ein Bild zu machen, indem man z. B. eine Blaupause platziert. Vielleicht ist das Ganze auch nur ein Bug auf meiner Seite und bei euch sieht das anders aus.


    Ein Präzisionsverlust ist aus technischer Sicht eigentlich kaum zu vermeiden, es kommt aber vor allem auf die Härte an. Jedenfalls wäre ich interessiert, ob red51 dazu mehr Auskunft geben könnte und ob dieses Problem lösbar wäre :thinking:


    Und natürlich: Bitte korrigiert mich, falls gesagte Informationen nicht stimmen :)

  • Dieses Problem war schon in der Java Version bekannt. Die daraus resultierenden Ungenauigkeiten bei weiter vom Spawn entfernten Gebäuden haben zu Rissen und Lücken und Flackern bei Postern geführt. Am besten baut man bei Koordinate 0 0 0, allerdings ist das auf einem Multiserver unmöglich. Wer sich nicht auf ein Biom oder eine Insel beschränken möchte, der muss wohl damit klarkommen.

  • Bei zunehmender Entfernung vom Nullpunkt nimmt die Genauigkeit leider tatsächlich spürbar ab :/ Das liegt daran, dass Koordinaten im Spiel als 32 Bit Gleitkommazahl (sog. "floating point number" oder kurz "float") repräsentiert werden, welche ca. 6-7 signifikante Stellen haben (sozusagen Stellen, die eine hohe Genauigkeit haben). Ist man ganz nahe am Nullpunkt, stehen quasi alle diese Stellen als Nachkommastellen zur Verfügung - das Spiel kann also Positionen und Größen mit einer Genauigkeit von ca. 0,000001 relativ präzise darstellen. Befindet man sich hingegen bei 10.000, werden schon 5 Stellen vor dem Komma "verbraten" - es bleibt also nur noch eine Genauigkeit von ca. 0,01 übrig. Ab 100k sind es nur noch ca. 0,1 und ab 1 Mio ist ca. nur noch eine blockweise Genauigkeit gegeben.


    Leider sieht Unity (anders als andere Engines) keine Notwendigkeit, Unterstützung für "doppelte Präzision" (also 64 Bit Zahlen bzw. sog. "doubles") einzubauen. Das würde das Problem auf einfachste Art vollumfänglich lösen ("doubles" haben ca. 15 signifikante Stellen), womit auch Abstände von mehreren Millionen Kilometern zum Nullpunkt präzise dargestellt werden könnten...


    Die einzige "Lösung" wäre daher, den Nullpunkt immer zu verschieben, wenn der Spieler sich bewegt. Sowas umzusetzen ist bei einem Spiel wie Rising World leider recht komplex - alle Koordinaten müssen jedes Mal umgerechnet werden. Das Verkompliziert viele Dinge enorm, und aufgrund der Komplexität bringt das auch eine gewisse Fehleranfälligkeit mit sich. Damit hätten wir aber eine quasi "unendliche Welt", denn dann wären theoretisch Entfernungen von ca. 40 Trillionen Kilometern zum Nullpunkt mit hoher Genauigkeit möglich (zum Vergleich, unsere Sonne ist gerade mal lächerliche 150 Millionen Kilometer von uns entfernt) :crazy:


    Langfristig möchten wir das gerne einbauen, aber da das Feature so umfangreich ist, neigen wir dazu, es etwas nach hinten zu schieben...


    ---


    Wie @Deirde schon sagt, diese Probleme gab es auch bereits in der Java Version (die ebenfalls 32 Bit Zahlen verwendete), allerdings war das Problem dort wesentlich schlimmer ausgeprägt: Hier haben schon wesentlich früher Elemente angefangen zu wabbeln oder zu flackern. Selbst einigermaßen nahe am Nullpunkt gab es bereits Flackern (zB wenn Poster vor Wänden platziert wurden).

    Wenn man sich in der Java Version bei zB 29.000 befindet und was baut und in der neuen Version bei 29.000 was baut, wird man feststellen, dass das in der neuen Version deutlich besser läuft (aber trotzdem alles andere als perfekt).


    Das größte Problem sind in meinen Augen aber die zitternden Hände: Auch das ist zwar weniger geworden als in der Java Version, ist aber nach wie vor zu stark ausgeprägt. Wir suchen da noch eine vernünftige Lösung... leider ist auch hier Unitys HDRP recht einschränkend, sodass das schwierig auf performante Weise umsetzbar ist... ich bin mir aber sicher, dass wir da noch eine Lösung finden werden :thinking:


    Das Texturproblem auf Bauelementen hingegen ist nicht gewollt :!: Das haben wir leider etwas vor uns hergeschoben (vor dem Welt-Update hat man sich ja kaum in diesen Regionen aufgehalten). Das werden wir mit dem nächsten Update beheben, sodass Texturen auch bei weiter Entfernung zum Nullpunkt normal dargestellt werden ;)


    Die Lücken in den Bauwerken bei weiteren Abständen zum Nullpunkt hingegen sind merkwürdig... tritt das nur bei Blaupausen auf? :wat:

  • So als Laie gefragt - kann man nicht einen zusätzlichen Faktor mit einbringen? Also das es mehr als einen 0-Punkt gibt? Gerade im MP wäre es ja schwierig den 0-Punkt mit dem Spieler zu verschieben, weil es mehrere Spieler gibt.


    Könnte man diesen 0-Punkt daher nicht Spieler (oder Client)-bezogen verschieben? Sodass jeder Spieler für sich einen eigenen 0-PUnkt hat.


    Oder 2 verschiedene Koordinaten-systeme. Eines das vom Spiel oder vom Server vorgegeben wird und den originalen 0-Punkt darstellt (und den Spawn). einen anderen das eben durch den Spieler oder Client (z.B. durch setzen eines Bettes, Zelts, etc) gesetzt wird. Wenn Spieler A sich für einen eigenen 0-PUnkt entschieden hat wird die Genauigkeit für das was er sieht von dort aus berechnet. Wenn Spieler B 100.000 Blöcke weit weg seinen 0-Punkt hat und er Spieler A besuchen kommt hätte der natürlich zittrige Hände und Ungenauigkeiten, während Spieler A aber immer noch alles scharf und deutlich sieht.

  • [...] (z.B. durch setzen eines Bettes, Zelts, etc) gesetzt wird. Wenn Spieler A sich für einen eigenen 0-PUnkt entschieden hat wird die Genauigkeit für das was er sieht von dort aus berechnet. [...]


    Hört sich doch nach ner guten idee an.

    Beim schlafen im Bett/Zelt hatt das Spiel denke ich auch genug Zeit die nötigen Berechnungen durchzuführen.

    Weil wenn man die ganzen verschiedenen Biome garnicht geniesen kann weil praktisch ab der nächsten insel schon probleme auftreten fände ich das doch etwas unpraktisch 😅

  • Hört sich doch nach ner guten idee an.

    Beim schlafen im Bett hatt das Spiel denke ich auch genug Zeit die nötigen Berechnungen durchzuführen.

    Weil wenn man die ganzen verschiedenen Biome garnicht geniesen kann weil praktisch ab der nächsten insel schon probleme auftreten fände ich das doch etwas unpraktisch 😅

    na ich glaub nicht dass das schlafen damit etwas zu tun haben sollte. Nur das Aufstellen des Bettes.

    Aber da bin ich technisch vollkommen "blind". Diese Lösung erscheint mir so offensichtlich, dass es da bestimmt einen Haken gibt.

  • Er kann es natürlich auch so lösen das dass Spiel die nötigen berechnungen in einem Ladebildschirm durchführt wenn du denkst das da weniger fehler passieren können

    Ich denke aber nicht das dass ernsthaft einen unterschied macht wie die dauer der berechnungen grafisch im Spiel angezeigt wird

  • Das Ganze umzusetzen stelle ich mir schwierig vor. Auf einen Multiplayserver greifen viele Spieler z. B. auf Teleportpunkte zu, die auch mit Koordinaten gespeichert werden bzw. ständig wechselnden Koordinaten: Hätte jeder Spieler seinen eigenen Nullpunkt, würden sich diese Daten immer wieder verändern.


    red51 Es gab, gibt für die Java-Version den Befehl graphic_logarithmic_depthbuffer, um das Flackern zu minimieren. Vielleicht könnte so etwas für die Unity auch verwendet werden.

    Es gab bei der Java-Version keine Lücken bei weiter entfernten Gebäuden, sondern Glitchen, also Flackereffekte, hatte das nicht mehr so genau in Erinnerung. ;)

  • Eventuell dann feste 0punkte wo sich im client speichert bei welchem man sich gerade befindet so das die relative position für alle clients einfach zu berechnen ist.

    Ist eventuell auch viel einfacher zu realisieren als individuelle 0 punkte die jeder durch setzen eines Zeltes setzen kann.


    Aber ich denke Red hat da schon einen plan und das ganze steht eh hinten an.

    Wenn es soweit ist werden wir es erfahren aber Yaromid hat schon recht das dass ein sehr wichtiger Punkt ist.

    Aktuell scheint dann ja nur ein Biom pro safegame wirklich spielbar zu sein und das wäre schade

  • Den 0 Punkt und damit die Grundlage für alle im Spiel befindlichen Objekte bei jeder Bewegung neu zu berechnen erscheint mir nicht sinnvoll.


    Daher der Vorschlag serverseitig einen festen 0 Punkt zu vergeben und Client seitig abhängig von z. B. Bett oder Zelt.


    Aber mal sehen was die Experten sagen :)

  • Langfristig möchten wir das gerne einbauen, aber da das Feature so umfangreich ist, neigen wir dazu, es etwas nach hinten zu schieben...

    Super zu hören :thumbup: Es ist jetzt natürlich auch erstmal wichtig, dass weitere Grund-Features ins Spiel kommen. Mit dem Besiedeln von anderen Inseln müssen sich jedenfalls die Baumeister aber erstmal gedulden. Ist jedenfalls sehr schade, dass Unity keine doppelte Präzision unterstützt ||


    Die Lücken in den Bauwerken bei weiteren Abständen zum Nullpunkt hingegen sind merkwürdig... tritt das nur bei Blaupausen auf?

    Nach schnellem Testen mit Bauen von normalen Blöcken neben der Blaupause, denke ich, dass das nur bei der Blaupause auftritt :thinking: Hier nochmal ein anderes Bild von dem „Fugenproblem“


    Die Wackeltexturen geben einem übrigens ziemliche PS1-Vibes :D

  • So als Laie gefragt - kann man nicht einen zusätzlichen Faktor mit einbringen? Also das es mehr als einen 0-Punkt gibt? Gerade im MP wäre es ja schwierig den 0-Punkt mit dem Spieler zu verschieben, weil es mehrere Spieler gibt.
    Könnte man diesen 0-Punkt daher nicht Spieler (oder Client)-bezogen verschieben? Sodass jeder Spieler für sich einen eigenen 0-PUnkt hat.

    Naja, das entspricht vom Aufwand her eigentlich bereits dem "Verschieben des Nullpunkts", was ich in meinem vorherigen Beitrag erwähnte ^^ Ob der Nullpunkt dann nur einmalig oder immer wieder dynamisch verschoben wird, macht eigentlich keinen so großen Unterschied mehr hinsichtlich der Implementierung.


    Das Problem ist, dass wenn der Nullpunkt nicht mehr bei 0 liegt, sondern irgendwo anders, dass das Spiel dann sämtliche Koordinaten umrechnen muss: Wenn ein Tier zB bei X 1000 und Z -500 spawnen soll, sind das bei verschobenem Nullpunkt ja plötzlich ganz andere Koordinaten (würde der Nullpunkt in 1000er Schritten verschoben, würde aus 1000 / -500 plötzlich 0 / 500 und ein Nullpunkt-Offset von 1 / -1). Hinzu kommt, dass Positionen nicht mehr als einfacher Vektor repräsentiert werden können (also jeweils ein X, Y und Z Wert), sondern man entweder doppelte Präzision verwenden muss, oder 3 Zusatzwerte für die Nullpunktposition.


    Bei einem kleineren Projekt wäre sowas noch einigermaßen einfach umzusetzen, bei RW gibt es aber so viele Stellen, wo mit Koordinaten gearbeitet wird - die müssten alle umgeschrieben werden. Und leider ist hier aufgrund der Komplexität großes Fehlerpotential vorhanden (wenn wir zB eine Stelle vergessen, kann das mitunter zu schwer auffindbaren Bugs führen)...


    Weil wenn man die ganzen verschiedenen Biome garnicht geniesen kann weil praktisch ab der nächsten insel schon probleme auftreten fände ich das doch etwas unpraktisch 😅

    Unsere Intention ist es eigentlich, auch ohne Verschiebung des Nullpunkts erstmal einen "gut" bespielbaren Bereich bis 30.000 bis 50.000 zu haben (also dass man in dieser Region keine Einschränkungen ggü. dem Nullpunkt haben muss). Grundsätzlich sollte das jetzt auch kein so großes Problem sein. Größtes Hindernis momentan sind eigentlich die zitternden Hände, was einfach unschön ist...


    Das oben erwähnte Texturproblem wird mit dem nächsten Update bereits behoben. Und Lücken zwischen Bauelementen sollten eigentlich auch nicht unbedingt auftreten, das müsste man sich einmal genauer anschauen, unter welchen Umständen das genau auftritt :monocle: Beides sollte behebbar sein.


    Langfristig (wenn die neue Version ausgereifter ist) kann man dann evtl. einen verschiebbaren Nullpunkt in Angriff nehmen, damit man eine wahrhaft "unendlich große Welt" hat ^^


    Er kann es natürlich auch so lösen das dass Spiel die nötigen berechnungen in einem Ladebildschirm durchführt wenn du denkst das da weniger fehler passieren können

    Die Berechnungen hinter einem "verschiebbaren Nullpunkt" selbst sind nicht so das große Problem... die würden zwar generell etwas Performance kosten (immer), das sollte aber einigermaßen überschaubar bleiben. Das Problem sind eher die enorm vielen Stellen im Spiel, die mit Koordinaten oder Vektoren arbeiten und die fortan umgerechnet werden müssen :dizzy:


    red51 Es gab, gibt für die Java-Version den Befehl graphic_logarithmic_depthbuffer, um das Flackern zu minimieren. Vielleicht könnte so etwas für die Unity auch verwendet werden.

    Dafür sehe ich eigentlich keinen Bedarf :thinking: In der neuen Version sollte es auch so wesentlich weniger Flackern als in der Java Version geben. Der logarithmische Tiefenbuffer behebt leider keine Probleme mit zitternden Händen oder wabbelnden Bauelementen, sondern reduziert lediglich das Flackern zwischen zwei eng übereinanderliegenden Bauteilen (zB das Flackern von Postern, die an Wänden hängen etc). Dafür kostet der logarithmische Tiefenbuffer aber auch Performance (weshalb er in der Java Version standardmäßig deaktiviert war).


    In der Java Version ist (auch trotz aktiviertem logarithmischem Tiefenbuffer) bei zB 32.000 die ganze Umgebung stark am wabbeln (selbst wenn man still steht). Wenn man sich in der Java Version einmal nach X 32000 und Z 32000 teleportiert und sich die gleiche Stelle in der neuen Version anschaut wird man feststellen, dass es in der neuen Version schon deutlich geschmeidiger läuft. Anbei mal ein Video davon, wie stark das in der Java Version ausgeprägt war (mit aktiviertem log. Tiefenbuffer): java-x32000-z32000.avi


    Nach schnellem Testen mit Bauen von normalen Blöcken neben der Blaupause, denke ich, dass das nur bei der Blaupause auftritt :thinking: Hier nochmal ein anderes Bild von dem „Fugenproblem“

    Das dürfte eigentlich ein lösbares Problem sein, denn eigentlich werden Bauteile bereits relativ zu ihrem Chunk gespeichert... ich denke, da summieren sich einfach beim Berechnen der Position (beim Platzieren der Blaupause) Rundungsfehler (aufgrund der eingeschränkten Genauigkeit von 32-Bit Zahlen). Ich schaue mir das einmal genauer an, vermutlich können wir das sogar schon mit dem nächsten Update beheben ;)

  • Unsere Intention ist es eigentlich, auch ohne Verschiebung des Nullpunkts erstmal einen "gut" bespielbaren Bereich bis 30.000 bis 50.000 zu haben (also dass man in dieser Region keine Einschränkungen ggü. dem Nullpunkt haben muss). Grundsätzlich sollte das jetzt auch kein so großes Problem sein. Größtes Hindernis momentan sind eigentlich die zitternden Hände, was einfach unschön ist...


    Das oben erwähnte Texturproblem wird mit dem nächsten Update bereits behoben. Und Lücken zwischen Bauelementen sollten eigentlich auch nicht unbedingt auftreten, das müsste man sich einmal genauer anschauen, unter welchen Umständen das genau auftritt :monocle: Beides sollte behebbar sein.

    na das hört sich doch schon viel besser an als ich das jetzt nach der Erstmeldung gedacht hatte ☺️

  • einen "gut" bespielbaren Bereich bis 30.000 bis 50.000 zu haben

    Wenn man den gut bespielbaren Bereich einschränkt, und alles darüber hinaus sowieso eher mäh ist, wieso macht man dann nicht eine "Weltkugel"(nicht physikalisch sondern rechnerisch)? Das heißt, dass man ab der Hälfte der Weltgröße sich wieder dem Nullpunkt annährt. Die größtmögliche Weltgröße könnte man an die maximal gut spielbare Größe anpassen. Das hätte auch einen spielerischen Reiz. Zum Beispiel kann man sich das Ziel setzen, den gesamten Planeten zu erkunden, zu umrunden oder im Creative Modus die Erde im kleineren Maßstab nachzubauen usw. Auch kann man Biombereiche an die Klimazonen der realen Welt anpassen mit Nord-Südpol, Gemäßigte Bereiche, Wüste Dschungel usw.

    Ich würde mit dieser Diskussion gerne ein technisches Problem ansprechen, was meiner Meinung nach kaum Beachtung findet und einen enormen Qualitätsmangel darstellt, der die Zukunft von Rising World gefährden könnte.

    Dann wäre eine Weltkugel eine Lösung. Und man hätte zwei Fliegen mit einer Klappe geschlagen: Es fügt einen gewissen Realismus hinzu und es löst das Problem mit der Größe der Spielwelt.

  • Die Fragen die sich hier im Vorfeld stellt:

    Wer braucht eine unendliche Welt und wie groß müsste eine Welt wirklich sein, zb für einen mp Server wo ja mehrere zusammen spielen

    In dem Moment in dem ein Spieler einen separaten Bereich mit verschiedenen angenzenden Biomen besiedeln möchte. Solch ein Gebiet ist sicherlich nicht dort

    zu finden wo der Server gerade seinen Spawn hinsetzen will.

    Ich baue mittlerweile unter anderem auch bei Koordinate 6221, 3733, das ist für Genauigkeit schon zu weit entfernt.

    Aber da ich das Problem kenne, werde ich meinen Spawn, wenn es mal Teleporter gibt, verlegen. Ich baue gerne in verschiedenen Biomen, um

    alles mitzunehmen.

    Letztendlich macht es keinen Unterschied ob Multiplayer oder Singleplayer, je weiter weg vom Spawn, desto ungenauer wird es, leider.

  • Die Fragen die sich hier im Vorfeld stellt:

    Wer braucht eine unendliche Welt und wie groß müsste eine Welt wirklich sein, zb für einen mp Server wo ja mehrere zusammen spielen

    Eine unbegrenzte Welt ist unnötig und unberechenbar. Das kann wie der Threadersteller schon treffend feststellt zu teilweise noch unvorhersehbaren Problemen führen.


    Die Maximalgröße muss sich nach der Größe richten, die noch ausreichend funktioniert. Damit es aber keine Weltgrenzen gibt wäre ein Planet die optimale Lösung.(Anfangs verschiedene Weltgrößen einstellbar, dass man auch kleine Planeten bebauen kann wenn man das möchte)


    Auch wird die maximale Strecke der größtmöglichsten Entfernung zweier Punkte halbiert, was das Reisen deutlich erleichtert! Das könnte sich auch auf den Nullpunkt auswirken, weil ja die maximale Entfernung halbiert ist und somit die maximale Weltgröße verdoppelt werden kann! (Weil man sich ja nach der Hälfte der Strecke wieder an den Nullpunkt annährt.)


    Ist dann überhaupt noch ein 0 Punkt notwendig wenn man mit den Weltgrenzen so umgeht?


    Das bietet noch weitere Vorteile, nämlich spielerische, man kann Breitengrade benutzen und kann die Biome realistisch anordnen. Natürlich kann man auch dazu bei den Inseln bleiben, was ich auch interessant finde. Und ich bin mir sicher, es wird Spieler geben, die unsere Welt im kleineren Maßstab nachbauen. Überlegt euch mal, wenn die gesamte Erde mit seinen Kontinenten, Inseln, Polregionen, Meeren, Seen, Erhebungen, Bergen, typische Landschaftsbilder und Wahrzeichen sowie weitere Points of Interests frei erkundbar wären. Ich bin mir sicher, dass auch im Multiplayer die kreative Gestaltungsarbeit da nie ausgeht. Auch Gemeinschaftsprojekte auf Servern wären denkbar usw usw. Und nein, man muss keine Krümmung einbauen, kann man aber machen, muss man aber nicht.

Participate now!

Don’t have an account yet? Create a new account now and be part of our community!