Как спасти процессуальный мир?


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-й) 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.