Як можна врятувати процедурний світ?


17

Нещодавно я читав про те, як створити процедурні світи ... але як зберегти його?

У таких іграх, як Terraria або Minecraft, користувачі можуть вільно змінювати ландшафт, але цей світ неможливо відтворити з самого початку. Які методи використовуються для збереження процедурних, але модифікованих світів?

Відповіді:


21

Збережіть насіння, яке ви використовували для створення світу, і модифікації або як атомні «команди», або результати цих.

Потім завантажуючи збережену гру, виконайте такі дії:

  1. Процедурно генеруйте частину світу, який ви зараз відвідуєте.
  2. Застосовуйте збережені команди або перезаписуйте створені елементи збереженими.

Оновлення: І звичайно, є можливість зберегти створений світ так само, як і звичайний світ, якщо ресурси доступні (як це видно в Minecraft). У цьому випадку вам слід зберегти лише ті частини світу, які вже відвідали (інакше процедурне покоління було б майже безглуздим), плитка за плиткою. Це з'їдає більше жорсткого диска та / або баз даних, але вимагатиме меншої потужності процесора під час завантаження гри.


2
Окрім модифікацій, йому, мабуть, також потрібно зберегти насіння, яке було використано для побудови процесуального світу ;-)
bummzack

@bummzack Так, звичайно, я забув це згадати, тому що це очевидно :-) Я відредагую свою відповідь.
Мартон

10
Я не зовсім впевнений, що відроджувати світ із насіння - найкраща ідея. Світове покоління зазвичай включає складні алгоритми, а значить, потрібен час: ми генеруємо випадкові світи не для економії простору, а для вигоди від випадковості. Тому я вважаю, що збереження всього світу у бінарному форматі було б ефективнішим.
Джонатан Коннелл

2
Отже, ви говорите, щоб зберегти процедурно створений світ, ви генеруєте його, а потім зберігаєте? Це не дуже повна відповідь.
MichaelHouse

2
@ Random832 Minecraft дійсно врятує світ у двійковому форматі, а не відновлює його з насіння та не відтворює модифікації. Щоб вирішити проблему порятунку всього світу, Minecraft рятує лише шматки, які були створені до цього часу. У міру подальшого вивчення світу ваша гра збереження стає більшою.
Джозеф Менсфілд

8

Збереження процедурно створеного світу - це те саме, що збереження будь-яких даних карти плитки.

Ви, ймовірно, захочете врятувати світ у двійковому форматі, якщо припустити, що світ побудований з різних типів плиток, вам доведеться:

  1. Визначте загальну кількість різних типів плитки (залежно від того, що вам потрібно буде більше або менше біт для представлення кожної плитки)
  2. Визначте ширину та висоту відвідуваного (модифікованого) світу.
  3. Представляйте плитку світу за плиткою від самої верхньої лівої плитки (включаючи небо) рядок за рядом до самої нижньої правої плитки.
  4. Якщо ви хочете заощадити на просторі, використовуйте DEFLATE або аналогічний алгоритм для стиснення цього 2d-масиву (представленого як 1-d) http://en.wikipedia.org/wiki/DEFLATE
  5. Використовуйте відповідний файл вводу-виводу для свого API для зберігання даних на диску.

Ви можете використовувати той самий метод, щоб зберегти карту на основі вокселів.

Зберігання моделі карт на основі вершин є більш складним.

Чи хотіли б я детальніше розглянути цю тему?


Якщо ви хочете, можливо, ви зможете зберегти його у png-файл шляхом кольорового кодування кожної плитки. Це дозволить швидко переглянути результат без використання спеціалізованого переглядача.
вовчий світанок

4

Про Minecraft світ використовує вокселі, тому зберегти їх досить просто, більше інформації тут:

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

http://www.minecraftwiki.net/wiki/Level_Format

Як уже було сказано, збережіть насіння, яке використовується для створення світу, і адаптуйте свій формат збереження до того, з чого складається ваш світ (кубики, атоми тощо).


3

Незалежно від структури даних, яку ви використовуєте для зберігання світу в пам'яті, можна використовувати як шаблон для запису та читання з диска. Процедурна частина вашої гри вперше заповнить ці структури даних, якщо даних немає з диска. Потім, коли ви будете готові вийняти область із пам'яті, запишіть її на диск у міру створення та модифікації.

Щоразу, коли ви готові завантажити нову область в пам’ять, спочатку перевірте, чи вона створена раніше та збережена на диску. Якщо він є, завантажте його з диска, а не з алгоритмів процедурного генерування.

Зазвичай це робиться з кусками місцевості. Можна або зберегти кожен фрагмент у власному файлі, або створити більш складну структуру диска, яка містить дані в одному файлі за допомогою таблиці пошуку. Є й інші питання щодо хороших способів збереження даних на диску.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.