Wie rettet man eine Verfahrenswelt?

17

Ich habe kürzlich gelesen, wie man prozedurale Welten erstellt ... aber wie speichere ich eine?

In Spielen wie Terraria oder Minecraft können Benutzer die Landschaft frei verändern, aber diese Welt kann nicht von Anfang an neu erstellt werden. Welche Techniken werden verwendet, um prozedurale, aber veränderbare Welten zu retten?

user1075940
quelle

Antworten:

21

Speichern Sie den Keim, mit dem Sie die Welt erzeugt haben, und die Änderungen entweder als atomare "Befehle" oder als deren Ergebnisse.

Wenn Sie das gespeicherte Spiel laden, gehen Sie folgendermaßen vor:

  1. Generieren Sie prozedural den Teil der Welt, den Sie gerade besuchen.
  2. Wenden Sie die gespeicherten Befehle an oder überschreiben Sie die generierten Elemente mit den gespeicherten.

Update: Und natürlich gibt es die Möglichkeit, Ihre generierte Welt wie eine normale Welt zu speichern, wenn die Ressourcen verfügbar sind (wie in Minecraft). In diesem Fall sollten Sie nur die Teile der Welt speichern, die bereits besucht wurden (andernfalls wäre die prozedurale Generierung ziemlich sinnlos), Kachel für Kachel. Dies verbraucht mehr Festplatten- und / oder Datenbankressourcen, erfordert jedoch beim Laden eines Spiels weniger CPU-Leistung.

Marton
quelle
2
Zusätzlich zu den Modifikationen muss er wahrscheinlich auch den Keim retten, der zum Aufbau der prozeduralen Welt verwendet wurde ;-)
bummzack
@bummzack Ja, das habe ich natürlich vergessen zu erwähnen, denn es ist offensichtlich :-) Ich werde meine Antwort bearbeiten.
Marton
10
Ich bin mir nicht ganz sicher, ob es die beste Idee ist, die Welt aus dem Samen zu regenerieren. Die Welterzeugung ist in der Regel mit komplexen Algorithmen verbunden und benötigt daher Zeit: Wir erzeugen zufällige Welten, um nicht generell Platz zu sparen, sondern um von der Zufälligkeit zu profitieren. Ich würde daher denken, dass das Speichern der gesamten Welt in einem Binärformat effizienter wäre.
Jonathan Connell
2
Sie wollen also eine prozedural erzeugte Welt retten, Sie erzeugen sie und retten sie dann? Dies ist keine sehr vollständige Antwort.
MichaelHouse
2
@ Random832 Mine tut Rette die Welt in ein binäres Format, anstatt sie aus dem Samen und Wiedergabe der Änderungen zu regenerieren. Um das Problem der Rettung der ganzen Welt zu umgehen, werden in Minecraft nur die bisher erzeugten Brocken gespeichert. Je weiter Sie die Welt erkunden, desto größer wird Ihr gespeichertes Spiel.
Joseph Mansfield
8

Das Speichern einer prozedural generierten Welt ist dasselbe wie das Speichern von Kacheldaten.

Wahrscheinlich möchten Sie die Welt im Binärformat speichern, vorausgesetzt, die Welt besteht aus verschiedenen Arten von Kacheln. Sie müssen Folgendes tun:

  1. Bestimmen Sie die Gesamtzahl der verschiedenen Kacheltypen (je nachdem, ob Sie mehr oder weniger Bits benötigen, um die einzelnen Kacheln darzustellen).
  2. Definieren Sie die Breite und Höhe der besuchten (modifizierten) Welt.
  3. Stellen Sie die Welt Kachel für Kachel von der obersten linken Kachel (einschließlich des Himmels) Reihe für Reihe bis zur untersten rechten Kachel dar.
  4. Wenn Sie Platz sparen möchten, verwenden Sie DEFLATE oder einen ähnlichen Algorithmus, um dieses 2d-Array (dargestellt als 1-d) zu komprimieren. Http://en.wikipedia.org/wiki/DEFLATE
  5. Verwenden Sie die entsprechende Datei-E / A für Ihre API, um die Daten auf der Festplatte zu speichern.

Mit derselben Methode können Sie auch eine voxelbasierte Karte speichern.

Das Speichern eines auf Eckpunkten basierenden Kartenmodells ist komplexer.

Möchten Sie, dass ich auf dieses Thema näher eingeht?

wolfdawn
quelle
Wenn Sie möchten, können Sie es möglicherweise in einer PNG-Datei speichern, indem Sie die einzelnen Kacheln farblich kennzeichnen. Dies ermöglicht es Ihnen , um Übersicht das Ergebnis schnell und ohne eine spezielle Viewer.
Wolfdawn
3

Unabhängig von der Datenstruktur, die Sie zum Speichern der Welt im Speicher verwenden, können Sie diese als Vorlage zum Schreiben und Lesen von der Festplatte verwenden. Der prozedurale Teil Ihres Spiels füllt diese Datenstrukturen beim ersten Mal, wenn keine Daten von der Festplatte verfügbar sind. Wenn Sie dann bereit sind, einen Bereich aus dem Speicher zu entladen, schreiben Sie ihn so auf die Festplatte, wie er generiert oder geändert wurde.

Wann immer Sie bereit sind, einen neuen Bereich in den Speicher zu laden, prüfen Sie zunächst, ob er zuvor generiert und auf der Festplatte gespeichert wurde. Wenn dies der Fall ist, laden Sie es von der Festplatte anstatt von Ihren Algorithmen zur prozeduralen Generierung.

Normalerweise wird dies mit Geländestücken durchgeführt. Sie können jeden Block entweder in einer eigenen Datei speichern oder eine komplexere Struktur auf der Festplatte erstellen, die Daten in einer einzelnen Datei mit einer Nachschlagetabelle enthält. Es gibt andere Fragen zu guten Möglichkeiten, Ihre Daten auf der Festplatte zu speichern.

MichaelHouse
quelle