Chunk

Aus Minecraft Wiki
Zur Navigation springen Zur Suche springen
Ein Chunk

Ein Chunk (von engl. Stück) ist ein 16×16×384 Blöcke großer Teilbereich einer Minecraft-Welt. In einem solchen Chunk werden alle Daten gespeichert, die für diesen Abschnitt der Welt relevant sind. Sowohl die aktuell geladene Spielwelt als auch die auf dem Speichermedium gesicherte Spielwelt werden als Chunks verwaltet.

Die Chunkdaten enthalten alle Blöcke, Biom-Informationen, Blockobjektdaten (z. B. Truheninhalte) und Objektdaten (Kreaturen, Fahrzeuge etc.) in einem Chunk. Chunks sind in 16×16×16 Blöcke große Sektionen eingeteilt. Sektionen, die komplett aus Luft bestehen, werden nicht gespeichert, was das Speichern und Laden von Chunks erheblich beschleunigt.

Man kann sich die Chunk- und Sektionengrenzen mit F3+G anzeigen lassen, Details siehe Debug-Bildschirm#Weitere Debug-Tasten.

Geladene und sichtbare Chunks[Bearbeiten | Quelltext bearbeiten]

Das Speichern und Laden von Daten kostet Zeit und verlangsamt das Spiel. Würde man zur Spielbeschleunigung die gesamte Welt auf einmal im Hauptspeicher halten, wäre der Hauptspeicherbedarf (RAM) zu groß und das Laden beim Start des Spiels und Speichern beim Beenden würde viel zu lange dauern. Würde man stattdessen jeden Block einzeln speichern, würde das Spiel nicht mehr flüssig ablaufen, sondern ständig ruckeln. Daher wurde die Lösung gefunden, die Welt chunkweise zu speichern und zu laden, wobei immer 32×32 Chunks in einer gemeinsamen Regionsdatei enthalten sind (dies wurde in Infdev mit dem Alpha Level Format eingeführt und bislang so beibehalten). Das aktuelle Speicherformat ist das Anvil File Format.

Beim Betreten des Spiels werden der Chunk, in dem sich der Spieler befindet, und die ihn umgebenden 8 Chunks in alle Richtungen geladen. Das sind (8 + 1 + 8)2 = 289 Chunks. Sobald sich der Spieler Richtung Horizont bewegt und dabei eine Chunkgrenze überschreitet, werden die hinter ihm liegenden Chunks außerhalb des Bereiches gespeichert und der vor ihm liegende Bereich mit neuen Chunks aufgefüllt. Sollten dafür noch keine Chunks existieren, werden sie generiert, was etwas länger dauert, als sie einfach nur zu laden.

Im Menü/Optionen/Grafikeinstellungen kann man die Sichtweite von 2 bis 16 oder auf manchen Rechnern sogar bis 32 Chunks einstellen. Bei der Einstellung "2" sind 2 Chunks in alle Richtungen um den Spieler sichtbar, also (2 + 1 + 2)2 = 25 Chunks.

Geladen sind jedoch immer mindestens 8 Chunks in alle Richtungen. Bei größeren Sichtweiten sind entsprechend mehr Chunks geladen.

Das Laden und Entladen der Chunks geschieht allerdings nicht sofort, sondern zeitverzögert. Daher muss man bei Chunk-Experimenten immer lange genug warten, bis alle Chunks richtig geladen und entladen sind, sonst erhält man falsche Ergebnisse.

Bei Chunk-Experimenten ebenfalls zu beachten ist der zentrale Sekundentakt, in dem ein Chunk aktiviert wird. Dadurch werden Redstone-Schaltungen immer synchron aktiviert, auch wenn sie über Chunkgrenzen hinweg verlaufen. Möchte man diese Tatsache testen, baut man eine Redstone-Clock, die genau eine Sekunde dauert. Dazu fügt man zehn Redstone-Verstärker ein, denn jeder verzögert das Signal um zwei Redstone-Ticks (=110 Sekunde). Daneben baut man eine Tageslichtsensor-Clock, die im zentralen Licht-Aktualisierungstakt läuft, der sekündlich erfolgt. Egal wie oft man den Chunk entlädt und wieder lädt, indem man sich weit entfernt und wieder nähert, beide Clocks werden immer synchron laufen. Das wäre nicht der Fall, wenn der Chunk immer sofort bei der entsprechenden Annäherung aktiviert werden würde.

Blockupdates[Bearbeiten | Quelltext bearbeiten]

Blockupdates finden nur innerhalb der Sichtweite statt.

Dies kann man nachweisen, indem man in jeweils 16 Blöcken Abstand z. B. ein Tropenholz mit Kakao aufstellt und dann zum Ausgangspunkt zurückkehrt. Das Pflanzenwachstum geschieht durch zufällige Blockupdates. Nach genügend langer Wartezeit prüft man nach, bis in welche Entfernung Blockupdates stattgefunden haben, d. h. wo der Kakao voll ausgewachsen ist.

Bei einer Sichtweite von 2 Chunks gibt es Blockupdates nur in den angrenzenden 2 Chunks, obwohl der Ladebereich 8 Chunks beträgt. Bei einer Sichtweite von 16 Chunks gibt es Blockupdates im gesamten Ladebereich von 16 Chunks.

Objektbewegungen[Bearbeiten | Quelltext bearbeiten]

Objekte bewegen sich nur in geladenen Chunks, aber nicht in den Randbereichen. Nähern sie sich der Grenze des geladenen Bereichs bis auf 2 Chunks, bleiben sie stehen.

Das kann man mit einer Lore nachweisen, die man auf ein mit Antriebsschienen versorgtes Gleis setzt, das in jedem Chunk eine Sensorschiene hat, die einen Kolben auslöst, der einen Block verschiebt. Schickt man die Lore los, wartet eine angemessene Zeit und zerstört sie dann aus der Ferne mit dem Befehl /kill @e[type=minecraft:minecart], kann man anhand der verschobenen Blöcke nachprüfen, wie weit sie gefahren ist.

Bei einer Sichtweite von 2 bis 8 Chunks sind es immer 6 Chunks. Bei einer größeren Sichtweite sind es (Sichtweite - 2) Chunks. Ein Güterfernverkehr über größere Strecken ohne Spielerbegleitung ist somit nicht möglich.

Drops sind auch Objekte. Man kann in jedem Chunk einen Block droppen, zum Ausgangspunkt zurückkehren und nach 5 Minuten prüfen, in welchen Chunks die Drops verschwunden sind. Das Ergebnis ist das gleiche wie bei der Lore.

Mit Objekten lassen sich Chunkloader realisieren, da ein Objekt welches durch ein Netherportal geworfen wird (vom Spieler, Werfer oder Dropper) oder eine Lore die durch das Portal fährt in der Oberwelt den Chunk in dem das Portal steht und 2 Chunks in jede Richtung und im Nether den Chunk in dem das Portal steht und 1 Chunk in jede Richtung für ca. 15 Sekunden lädt.

Da Objekte nachdem sie durch das Portal gekommen sind eine Abklingzeit besitzen bevor sie wieder durch ein Portal reisen können, muss man sie (bei Drops) aufsammeln, (bei Loren) zerstören und aufsammeln und sie erneut werfen bzw. setzen.

Befehle[Bearbeiten | Quelltext bearbeiten]

Befehle können in der Regel nur auf geladene Chunks wirken. Eine Außnahme bildet der Befehl /teleport, der das Ziel an einen beliebigen gültigen Ort der aktuellen Dimension bringt. Der zugehörige anvisierte Chunk wird ggf. geladen bzw. sogar generiert.

Wendet man z.B. den Befehl /setblock an und setzt einen Block bei ~, ~16, ~32, ~48 etc., erhält man, sobald man den geladenen Bereich überschreitet, die Meldung: "Kann Block nicht außerhalb der geladenen Welt platzieren".

Das kann man nicht nur mit Blöcken, sondern auch mit Objekten testen. Platziert man z. B. in jedem Chunk ein Huhn, tötet der Befehl /kill @e[type=minecraft:chicken] bei einer Sichtweite bis 8 Chunks alle Hühner in 8 Chunks Entfernung. Weiter entfernte Hühner bleiben am Leben. Bei größerer Sichtweite sind entsprechend mehr Chunks geladen und durch Befehle erreichbar.

Um zu prüfen ob ein Bereich geladen ist, kann man den Befehl /execute if loaded verwenden. Dieser gibt eine Rückmeldung ob dieser Bereich geladen ist oder nicht.

Spawning[Bearbeiten | Quelltext bearbeiten]

Das Spawnen von Monstern geschieht immer in einem Bereich von 9 Chunks Entfernung (siehe Spawn#Der Spawn-Bereich). Die Sichtweite spielt dabei keine Rolle.

Redstone-Signale[Bearbeiten | Quelltext bearbeiten]

Redstone-Signale haben eine Besonderheit: Sie werden auch in Chunks weitergeleitet, die außerhalb des geladenen Bereichs liegen.

Um dies zu prüfen, kann man eine immer wieder verstärkte Redstone-Leitung beliebig weit verlegen und in jedem Chunk an einen Kolben anschließen, vor den man einen Block legt. Dann kehrt man zum Ausgangspunkt zurück, aktiviert das Signal mit einem Hebel, wartet einen Moment und deaktiviert es wieder. Dann kann man prüfen, wie weit das Signal geleitet wurde und stellt fest, dass es mehr als 32 Chunks sind (größere Entfernungen wurden bisher nicht getestet). Das kann nur funktionieren, wenn ein Chunk nachgeladen wird, sobald ein aktives Redstone-Signal hinein läuft.

Allerdings zählt ein nachgeladener Chunk nicht zum Bereich der geladenen Chunks und ist vom Ausgangspunkt aus weiterhin weder durch Befehle noch durch Objekte erreichbar.

Anders sieht es mit an diese Leitung angeschlossenen Befehlsblöcken aus. Mit einer durchgehenden Leitung kann man auch einen Befehlsblock in weiter Entfernung aktivieren. Aufgrund der Länge der Leitung ist eine entsprechende Signalverzögerung zu beobachten.

Ebenso läuft ein Taktgeber in einem nachgeladenen Chunk nur, solange das Signal vom Ausgangspunkt in diesen Chunk hineinläuft. Sobald es beendet wird, wird der Chunk wieder entladen und der Taktgeber stoppt.

Spezielle Chunks[Bearbeiten | Quelltext bearbeiten]

Dauerhafte Chunks[Bearbeiten | Quelltext bearbeiten]

In der Oberwelt sind der Chunk mit dem Spawnbereich-Mittelpunkt und die umliegenden Chunks in einem Radius bis zu 8 Chunks in gewisser Weise dauerhaft geladen, egal wie weit man sich von ihnen entfernt. Dort platzierte Flüssigkeiten fließen weiter, Feuer breitet sich aus und herumliegende Gegenstände verschwinden. Andererseits verhalten sich diese Chunks in Bezug auf gerade entfernte Flüssigkeiten, ausgehendes Feuer sowie Zufällige Block Ticks wie ungeladene Chunks.

Im Einzelspielermodus gilt das, solange der Spieler irgendwo in der Oberwelt ist. Wechselt er die Dimension oder verlässt er das Spiel, werden auch diese Chunks entladen.

Mit dem Befehl /forceload kann man in jeder Dimension einzelne Chunks oder Chunkbereiche gezielt dauerhaft laden. Das ist vor allem für Redstone-Schaltungen und Befehlsblöcke wichtig, die in diesen Chunks immer weiter laufen.

Schleimchunks[Bearbeiten | Quelltext bearbeiten]

Schleime spawnen unterhalb Ebene 40 in zufällig ausgewählten Schleimchunks. Die Wahrscheinlichkeit, dass ein Chunk ein spezieller Schleimchunk ist, beträgt 10 %. Dazu wird für jeden neu generierten Chunk mittels einer Pseudo-Zufallsfunktion in Abhängigkeit vom Startwert ein für alle Mal festgelegt, ob dies ein Schleimchunk ist oder nicht:

Random rnd = new Random(seed +
                        (long) (xPosition * xPosition * 0x4c1906) +
                        (long) (xPosition * 0x5ac0db) + 
                        (long) (zPosition * zPosition) * 0x4307a7L +
                        (long) (zPosition * 0x5f24f) ^ 0x3ad8025f);
return rnd.nextInt(10) == 0;

Die Funktion ermittelt eine Zufallszahl von 0 bis 9, indem sie auf auf die Koordinaten des Chunks und den Startwert der Welt zurückgreift. Ist diese Zahl eine 0, handelt es sich um einen Schleimchunk. Koordinaten eines Chunks werden übrigens gebildet, indem eine Blockkoordinate durch 16 geteilt und dann abgerundet wird.

Auch im Pilzland und dessen Variante, der Pilzlandküste, treten Schleimchunks auf. Auf Grund der speziellen Gegebenheit des Bioms können allerdings keine Schleime spawnen, was die betroffenen Chunks ganz normal erscheinen lässt.

Mehrspielermodus[Bearbeiten | Quelltext bearbeiten]

Im Mehrspielermodus hält der Server die Chunkbereiche um jeden Spieler herum in seinem Hauptspeicher. Je mehr Spieler auf der Welt verteilt sind, desto größer ist die Menge an geladenen Chunks. Jeder Spieler hält die Welt um sich herum in Bewegung, d. h. in allen geladenen Chunks berechnet der Server die Blockupdates, Objektbewegungen, Redstone-Signale etc.

Daher muss ein Server je nach Spielermenge mit einem entsprechend großen Hauptspeicher ausgestattet sein.

Erst wenn sich sämtliche Spieler von einem bestimmten Chunk entfernen, wird sein momentaner Zustand eingefroren und in den Chunkdaten gespeichert.

Im Mehrspielermodus ist man üblicherweise über eine Datenfernverbindung wie das Internet mit dem Server verbunden. Für ein flüssiges Spiel sollte dabei die übertragene Datenmenge nicht zu groß sein. Daher begrenzen manche Server die Übertragungsmenge auf beispielsweise 8 Chunks in jede Richtung. Auch wenn man eine größere Sichtweite einstellt, kann man dann nicht weiter als 8 Chunks sehen.

Der zentrale Oberwelt-Chunk ist im Mehrspielermodus immer geladen, solange der Server läuft, also auch wenn kein Spieler in der Oberwelt ist und sogar, wenn kein Spieler im Spiel ist. Dies kann man testen, indem man einen Kolben an einen langsamen Taktgeber anschließt und vor dem Kolben eine Sandsäule aufstellt, sodass der Kolben den Sand Block für Block in ein bodenloses Loch schiebt.

Chunkfehler[Bearbeiten | Quelltext bearbeiten]

Wenn es durch einen Bug zu Beschädigungen eines Chunks kommt und die Welt nicht mehr geladen werden kann, hat man nur die Möglichkeit, von außen einzugreifen. Wenn der beschädigte Chunk bekannt ist, kann man versuchen, ihn mit einem Editor wie MCEdit zu löschen. Das Spiel wird den fehlenden Chunk dann neu generieren, sobald er geladen wird. Der Chunk wird dabei wieder im Ursprungszustand erzeugt. Alle auf diesem Chunk vom Spieler verursachten Veränderungen sind nicht mehr vorhanden.

Ein Chunkfehler

Im Mehrspielermodus entstehen manchmal Anzeigefehler durch Chunks, die fehlerhaft oder gar nicht vom Server zum Client übertragen wurden. Dort sieht man dann ein 16×16 großes Loch, das nicht betreten werden kann. Um das zu beheben, reicht es normalerweise F3 + A zu drücken um alle Chunks neu zu laden, oder den Server zu verlassen und erneut zu verbinden.

Technik[Bearbeiten | Quelltext bearbeiten]

Geschichte[Bearbeiten | Quelltext bearbeiten]

In diesem Blogeintrag vom 23. Februar 2010 erklärt Notch, warum er als Chunkgröße 16×16 Blöcke gewählt hat.

Versionsgeschichte der Java Edition
Infdev 20100227
  • Die Entwicklung grenzenloser Welten beginnt, die Spielstände dieser Welten werden im Alpha Level Format gespeichert, das erstmalig Chunks verwendet.
Beta 1.3
  • Das neue Region Format kann die Chunkdateien deutlich schneller speichern und löst das Alpha Level Format ab.
Vollversion 1.2 (12w07a)
  • Chunks sind doppelt so hoch (256 statt 128 Blöcke).
  • Die Chunks sind in 16×16×16 Block große Chunk-Sektionen unterteilt.
  • Chunk-Sektionen, die nur aus Luft bestehen, werden nicht gespeichert.
Vollversion 1.8 (14w30a)
  • Chunks werden um ein Vielfaches schneller geladen.
  • Die maximale Sichtweite beträgt 32 Chunks.
Vollversion 1.10 (16w20a)
  • F3 + G zeigt die den Spieler umgebenden Chunk-Grenzen.
Vollversion 1.13.1
18w31a
  • Mit dem Befehl /chunk können dauerhaft geladene Chunks erstellt und entfernt werden.
1.13.1-pre1
Vollversion 1.17 (21w06a)
  • Die maximale Höhe des Chunks wird von 256 auf 320 Blöcke angehoben, ebenso wird die Tiefe von 0 auf -64 abgesenkt.
Vollversion 1.19.4 (23w03a)
  • Mit dem Befehl /execute if loaded x y z lässt sich prüfen ob ein Chunk geladen oder nicht geladen ist.