Bauhöhe in Minecraft wurde nun erhöht, aber wie haben die das programmiertechnisch gemacht?



  • Die maximale Bauhöhe wird um 128 auf 256 Blöcke erhöht.

    http://de.minecraftwiki.net/wiki/Versionsgeschichte

    Maximum build height has been increased to 256 (was 128)
    Empty sections of the world are not loaded into memory

    http://www.mojang.com/2012/02/new-minecraft-map-format-anvil/

    Die Bauhöhe war ursprünglich ja vom Levelboden aus gezählt schon 256 Blöcke hoch, was genau 1 Byte für die y-Achse entspricht.

    Nun ist sie aber insgesamt 256+128 = 384 Blöcke hoch, das paßt nicht mehr in 1 Byte rein, man braucht dafür 9 Bit und selbst diese werden gar nicht voll ausgenutzt, denn 384-1 entspricht genau der Zahl 101111111 im Binärsystem.
    Prinzipiell hätte eigentlich eine Blockhöhe von 512 Blöcke möglich sein, damit die 9 Bits optimal ausgenutzt werden.

    Aber das ist ja nicht das einzige Problem.
    Mit einzelnen Bitwerten, insbesondere solche ungeraden wie 9 Bit läßt sich auch sehr schlecht rechnen. Programmiersprachen wie Java können mit Bitwerten die durch 8 teilbar sind, viel besser umgehen.

    Wie wurde dies daher gelöst?
    Wie wird die y-Achse also auf der Festplatte und wie im Arbeitsspeicher gespeichert?

    Block ids have been increased to 4096 (was 256) by adding a 4 bit data layer (similar to how meta data is stored)

    Hier, bei der Block-ID ist das viel einfacher.
    Da werden einfach 2 Blöcke paarweise gespeichert wovon sie sich jeweils 1 Byte teilen. Zusammen brauchen sie also 3 Bytes. Das läßt sich noch halbwegs gut umsetzen und auch Speichern.

    Aber diese obigen 9 Bit sind doch eigentlich grauenhaft.
    Wer weiß genaueres darüber?



  • Programmierersicht schrieb:

    Die Bauhöhe war ursprünglich ja vom Levelboden aus gezählt schon 256 Blöcke hoch, was genau 1 Byte für die y-Achse entspricht.

    Nö. Die Welten waren immer schon 128 Blöcke hoch.



  • Programmierersicht schrieb:

    Die Bauhöhe war ursprünglich ja vom Levelboden aus gezählt schon 256 Blöcke hoch, was genau 1 Byte für die y-Achse entspricht.

    täusch ich mich, oder kennt java keine unsigned typen 😕



  • 314159265358979 schrieb:

    Programmierersicht schrieb:

    Die Bauhöhe war ursprünglich ja vom Levelboden aus gezählt schon 256 Blöcke hoch, was genau 1 Byte für die y-Achse entspricht.

    Nö. Die Welten waren immer schon 128 Blöcke hoch.

    Dann probiers aus.

    Drück F3 und bau nen Turm, dann schau den Wert an.
    In der alten Version lag der dann bei 128. Mit der neuen Version sind 256 möglich.

    Anschließend geh wieder auf Meereshöhe und dann grab dich bis zum Bedrock runter,
    nun dürfte y beim Wert -127 stehen.

    Insofern gab es einen Bereich zwischen -127 und +128, also genau 256 Blöcke.

    täusch ich mich, oder kennt java keine unsigned typen 😕

    Der setzt den Wert wahrscheinlich künstlich um, damit die Meereshöhe in der y Achse bei 0 liegt.
    An der Speicherung der Daten dürfte dies aber nichts ändern.



  • Pro Block wird doch ohnehin mehr als ein Bit gespeichert, wer weiß was der Multiplikator ist?!

    MfG SideWinder



  • Beim oben verlinkten Artikel gibt es übrigens einen Link zum Download eines Converters, der im Quellcode vorliegt.
    Daran müßte man das Format näher untersuchen können.
    http://www.mojang.com/2012/02/new-minecraft-map-format-anvil/



  • Dieser Thread wurde von Moderator/in TravisG aus dem Forum Gaming-Corner in das Forum Spiele-/Grafikprogrammierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Programmierersicht schrieb:

    Anschließend geh wieder auf Meereshöhe und dann grab dich bis zum Bedrock runter,
    nun dürfte y beim Wert -127 stehen.

    Nein. Der y-Wert ist dann 0...



  • Es gibt Versuche von 1024 oder 2048 Blocks Höhe also wird es wohl nicht nur ein Byte sein.

    Die größen werden übrigens implizit gespichert. Also bis vor 1.2 war ein Chunk die gespeicherte Datenstruktur (vermutlich auch die zur Runtime verwendete). Dies war ein Array eher wie BlockData[CHUNK_X_SIZE][CHUNK_Z_SIZE][CHUNK_Y_SIZE /* Höhe */] und da ist die Höhe nicht per Block festgelegt. 32x32 Chunks ergeben eine Region, die angespeichert werden.

    Neuerdings sind die Chunks noch einmal in der Höhe geteilt zu 16x16x16 Blöcke und diese können beliebig gestapelt werden.

    Das Problem waren nur Bithacks an verschieden Stellen die eine Änderung der Höhe erschweren.



  • Rhombicosidodecahedron schrieb:

    Es gibt Versuche von 1024 oder 2048 Blocks Höhe also wird es wohl nicht nur ein Byte sein.

    Die größen werden übrigens implizit gespichert. Also bis vor 1.2 war ein Chunk die gespeicherte Datenstruktur (vermutlich auch die zur Runtime verwendete). Dies war ein Array eher wie BlockData[CHUNK_X_SIZE][CHUNK_Z_SIZE][CHUNK_Y_SIZE /* Höhe */] und da ist die Höhe nicht per Block festgelegt. 32x32 Chunks ergeben eine Region, die angespeichert werden.

    Neuerdings sind die Chunks noch einmal in der Höhe geteilt zu 16x16x16 Blöcke und diese können beliebig gestapelt werden.

    Das Problem waren nur Bithacks an verschieden Stellen die eine Änderung der Höhe erschweren.

    Ich habe leider kein Minecraft und frage mich daher: Wie kommt man an den code ran?



  • Decompilieren.



  • MisterX schrieb:

    Ich habe leider kein Minecraft und frage mich daher: Wie kommt man an den code ran?

    Selbst schreiben (wenn es um das einlesen von Region und Chunk geht.

    http://www.minecraftwiki.net/wiki/Development_Resources
    http://www.minecraftwiki.net/wiki/Anvil_file_format
    http://www.minecraftwiki.net/wiki/Region_file_format

    Bitte auch Links weiterverfolgen.



  • Minecraft ist in Java programmiert.
    Java wird, nicht wie C++ in Maschinencode kompiliert,
    sondern in einen Zwischencode.
    Den kannn man ganz einfach dekompilieren,
    und alle Variablen Namen und die kommentare bleiben auch.
    Deshalb ist Java auch langsamer als C++.

    Außerdem wurde immer ein Open Source Programm erstellt, dass das Alte LVL-Format (MC-Region) und das neue LVL-Format erklärt gemacht



  • Deshalb ist Java auch langsamer als C++.

    😃 👍



  • Ich hoffe ich füttere nicht.

    Exponator schrieb:

    Minecraft ist in Java programmiert.
    Java wird, nicht wie C++ in Maschinencode kompiliert, sondern in einen Zwischencode.

    Und?

    Exponator schrieb:

    Den kannn man ganz einfach dekompilieren, und alle Variablen Namen und die kommentare bleiben auch.

    Stimmt nicht, Minecraft besitzt eine leichte Obfuscation, indem alle Klassen-, Methoden- und Feldernamen ersetzt werden. Kommentare werden natürlich nicht mit übersetzt! Dies wird ersichtlich, wenn man die ".jar" (z.B.: von den weekly snapshots) mit einem fast beliebigem Entpackungspragramm öffnet. Dann dann sind alle Klassen durchnummeriert.
    "a", "b", ... "z", "aa", "ab", ... "zz", "aaa" ... - kann man das durchnummeriert nennen? Durchalphabetisiert?

    Exponator schrieb:

    Deshalb ist Java auch langsamer als C++.

    Stimmt nicht.
    🙄
    Deshalb ist Java nicht langsamer als C++.


  • Mod

    ich finde ja gut dass ihr hier relativ objektiv seit, aber frueher oder spaeter wird sowas immer in flame abgleiten, deswegen loesche ich ab hier jegliches "java is...", denn hier geht es um Minecraft und desgleichen.



  • arbeite gerade mit minecraft region und chunks und die höhe ist in einem byte gespeichert.



  • Patrickssj6 schrieb:

    arbeite gerade mit minecraft region und chunks und die höhe ist in einem byte gespeichert.

    Vom Bedrock bis zu maximalen Höhe sind es 256+128 Klötze.
    Wie paßt das in ein Byte?



  • Es sind 256.



  • naja es waren mal 128 jetzt sind es 256
    das was du mit wahrscheinlich betrachtet hast bei F3 ist der map-spawnpoint der sich natürlich verschoben hat wenn du dich unter den meeresspiegel gräbst und deswegen einen negativen wert erreicht hat. zudem liegt meeresspiegel bei 64 und da lag er schon immer ^^



  • Hast du mal aufs Datum gesehen?!


Anmelden zum Antworten