Как вы организуете сохранение состояния мира в процедурно-генерируемых играх? Делитесь архитектурой

Рейтинг: 57% · 16 голосов
Создание игр на Unity, Unreal Engine, Godot: 3D-графика, шейдеры, физика, геймдизайн, оптимизация и инди-проекты.
Ответить
Аватара пользователя
proxmox10
Сообщения: 10
Зарегистрирован: 10 май 2026, 23:30

Как вы организуете сохранение состояния мира в процедурно-генерируемых играх? Делитесь архитектурой

Сообщение proxmox10 »

Делаю roguelike с процедурными подземельями на Unity 6. Столкнулся с классической проблемой: как сохранять состояние мира, если он генерируется на лету? Чанки, которые игрок уже посетил, должны сохраняться (сундуки открыты, враги убиты, двери сломаны), а не генерироваться заново при возврате. При этом непосещённые чанки генерировать по сиду. Сейчас у меня каждый чанк сериализуется в JSON при выгрузке, но при большом мире это уже ~40 МБ файла сохранения после часа игры. Интересно, как другие решают эту задачу.
👍5 ❤️ 🔥 😄 🤔1
✔ Лучший ответ сформирован автоматически — kickmybox
40 МБ за час — это явно что-то не так с гранулярностью. Зачем сохранять весь чанк? Сохраняй только дельту от seed-состояния. Логика такая: при загрузке чанка генеришь его из сида, потом применяешь список изменений (delta). Delta — это просто список событий: [{ type: chest_opened, id: 42 }, { type: enemy_killed, id: 7 }]. В итоге сохранение чанка, где игрок убил 5 врагов и открыл 2 сундука — это 7…
Перейти к ответу →
Аватара пользователя
kickmybox
Сообщения: 60
Зарегистрирован: 11 май 2026, 08:23

Re: Как вы организуете сохранение состояния мира в процедурно-генерируемых играх? Делитесь архитектурой

Сообщение kickmybox »

✔ Лучший ответ — сформирован автоматически
40 МБ за час — это явно что-то не так с гранулярностью. Зачем сохранять весь чанк? Сохраняй только дельту от seed-состояния. Логика такая: при загрузке чанка генеришь его из сида, потом применяешь список изменений (delta). Delta — это просто список событий: [{ type: chest_opened, id: 42 }, { type: enemy_killed, id: 7 }]. В итоге сохранение чанка, где игрок убил 5 врагов и открыл 2 сундука — это 7 записей, а не весь чанк целиком.
👍 ❤️1 🔥 😄 🤔
Аватара пользователя
regexlover
Сообщения: 18
Зарегистрирован: 21 май 2026, 11:59

Re: Как вы организуете сохранение состояния мира в процедурно-генерируемых играх? Делитесь архитектурой

Сообщение regexlover »

Используем подход с двухуровневым хранением. Первый уровень — SQLite прямо в проекте (через плагин), там хранится таблица chunk_deltas (chunk_x, chunk_y, seed, events_json). Второй уровень — in-memory кеш активных чанков. При сохранении только flush изменённых чанков. SQLite даёт транзакционность, не боишься partial write при краше игры. Размер сохранения у нас после 10 часов игры — около 2 МБ.
👍 ❤️1 🔥1 😄 🤔
Аватара пользователя
FpgaDev
Сообщения: 43
Зарегистрирован: 12 май 2026, 04:40

Re: Как вы организуете сохранение состояния мира в процедурно-генерируемых играх? Делитесь архитектурой

Сообщение FpgaDev »

@regexlover, MessagePack вместо JSON даст тебе сжатие примерно в 3-5 раз без изменения архитектуры. Это не решение проблемы, но быстрая победа пока ты думаешь над нормальной архитектурой. В Unity есть несколько реализаций, K4os.Compression.LZ4 в связке с ним даёт ещё лучше.
👍 ❤️ 🔥 😄 🤔1
Аватара пользователя
rhinz
Сообщения: 10
Зарегистрирован: 23 май 2026, 23:20

Re: Как вы организуете сохранение состояния мира в процедурно-генерируемых играх? Делитесь архитектурой

Сообщение rhinz »

Важный момент который все забывают: версионирование формата сохранений. Когда ты обновишь игру и добавишь новые типы объектов или изменишь генерацию — старые сохранения сломаются. Заложи с самого начала поле version в формат и migration-логику. Боль от этого в продакшне несравнимо больше, чем размер файла.
👍3 ❤️ 🔥 😄 🤔
Ответить
Поделиться темой: ✈ Telegram VK

Вернуться в «Геймдев и разработка игр»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей