DevLog #2 Welten und "World-Loading" in AtlasMC

Welten in Minecraft sind der Dreh- und Angelpunkt des Spielgeschehens. Die standard Implementierung ist dafür gedacht, Chunks dynamisch bereitzustellen. Unabhängig von Anzahl und der Position. Ein solcher ChunkProvider ist so aufgebaut, dass die Position und der Chunk in zwei Arrays gespeichert werden. Mit einem binären Suchalgorithmus ist es so ein Leichtes, schnell einen Chunk anhand seiner Koordinaten zu finden. Dies setzt allerdings voraus, dass die Arrays sortiert sind. Alternativ, zur Binarysearch, kann man auch einfach die Arrays Element für Element durchgehen (lineare Suche), bis man das Ende erreicht oder den entsprechenden Chunk findet. Diese Implementierung bietet den Vorteil, dass die Arrays nicht sortiert sein müssen. Jedoch ist sie auch bei größeren Mengen an Chunks ineffizient.

Beispiel:
Binary search Linear search
Schlimmster Fall log2 n n
Bester Fall 1 1
Durchschnitt log2 n n/2


Die Geschwindigkeit der Implementierung lässt sich bei einem Provider für eine dynamische Weltgröße, allerdings erst ab einer gewissen Größe, mit einem Cache für häufig genutzte Chunks erhöhen. Da die meisten Spielmodi aber meist auf einen festen Bereich von annehmbarer Größe setzen, ist es bei diesen Modi möglich, eine neue Art ChunkProvider zu nutzen. Hierbei wird ein Array, in dem alle Chunks für den Spielbereich Platz finden geordnet, sodass alle Positionen der Chunks im Array berechenbar sind. Diese Art des Zugriffs ermöglich eine gleichbleibende und schnelle Zugriffsgeschwindigkeit. Neben der Optimierung der Zugriffszeit kann man die benötigte Menge an Arbeitsspeicher für einen Spielmodus noch weiter reduzieren. In Atlas wird das möglich werden, da mehrere Instanzen eines Spielmodus in ein und derselben Node laufen können. Bei einer gleichbleibenden Karte ist es so möglich, diese nur ein einziges Mal laden zu müssen und dann für alle Instanzen zu nutzen. Jedoch ist dieses Beispiel nicht auf jeden Modus übertragbar. Bei Spielmodi mit einer starken Veränderung der Umgebung während eines Matches, wäre es nur bedingt möglich dieses System der geteilten Weltdaten zu nutzen. Da alle guten Dinge drei sind haben wir hier noch eine dritte Form des ChunkProviders. Dieser kann auf Basis einer großen Welt welche dynamisch Chunks lädt, und bei kleineren "fixen" Welten funktionieren.

Es handelt sich hierbei um einen ChunkProvider, welcher es ermöglicht dem Spieler die Illusion zu vermitteln die Welt umrunden zu können.



Im nächsten DevLog geht es weiter mit dem Thema "Server"! Seid gespannt und lasst Euch überraschen, wie wir das Thema "Server" in AtlasMC, unserer eigenen Serversoftware, angehen werden.

Ihr habt Fragen, Anmerkungen, Wünsche oder Anderes? Dann registriert Euch gerne bei uns im Forum, besucht uns auf Discord oder schaut auf GitHub vorbei.


Forum-Registrierung Discord GitHub AtlasMC