Варианты хранения огромной карты тайлов
Я создаю псевдо-пошаговую браузерную онлайн-стратегию, в которой многие люди играют в одном мире в течение длительного периода (месяцев). Для этого я хочу иметь карту размером 64000x64000 плиток = 4 миллиарда плиток. Мне нужно около 6-10 байт данных на плитку, что составляет около 30 ГБ данных для хранения карты.
У каждой плитки должны быть такие свойства, как тип (вода, трава, пустыня, гора), ресурс (дерево, коровы, золото) и playerBuilt(дорога, здание)
Клиенту когда-либо понадобится доступ только к 100x100 плиткам одновременно.
Я обработал карту на стороне клиента под контролем. Проблема, с которой я столкнулся, заключается в том, как хранить, извлекать и изменять информацию из этой карты на стороне сервера.
Требуемая функциональность:
- Создать, сохранить и изменить 64000x64000 тайловую карту.
- Покажите клиенту 100х100 часть карты.
- Внесите изменения в карту, такие как дороги, здания и истощенные ресурсы.
Что я учел до сих пор:
- Процедурная генерация: Процедурная генерация любой части карты, необходимой на лету. Убедившись, что при наличии одного и того же семени, он всегда генерирует одну и ту же карту. Основная проблема, с которой я столкнулся, заключается в том, что во время игры на карту будут вноситься изменения. Примечание. Менее 1% плиток будет изменено во время игры, и можно будет хранить изменения с координатами во внешнем массиве. Загрузка их поверх процедурного поколения.
- Базы данных: создание карты в начале игры и сохранение ее в базе данных. Друг посоветовал мне отказаться от такой огромной карты тайлов и сказал, что я, вероятно, захочу хранить ее в памяти.
- Хранение всего этого в памяти на стороне сервера: Хранение этого в памяти в структуре данных. Похоже, хороший способ сделать это, если карта была меньше, но для 4 миллиардов плиток было бы много, чтобы сохранить в памяти.
Я планировал использовать java+mysql для серверной части этого проекта. Я все еще на ранних стадиях и могу изменить технологию, если это необходимо.
Мой вопрос: какой из трех подходов, представленных выше, кажется жизнеспособным и / или есть ли другие способы сделать это, которые я не рассматривал?
1 ответ
Зависит от:
- сколько оперативной памяти у вас есть (или у игрока / пользователя)
- Является ли большая часть карты тайлов пустой? Напротив плотный.
- Есть ли местность по умолчанию (например, пусто или вода?)
Если разрежено, используйте хэш-карту вместо 2D-массива.
Если он плотный, он будет намного сложнее, и вам может понадобиться использовать базу данных или некоторые специальные структуры данных + кэш. Вы можете обнаружить горячие зоны и некоторое время хранить их в памяти, мертвые зоны (нет игроков, нет активности...) могут храниться в базе данных и считываться по требованию. Вы также можете загружать данные в несколько проходов: сначала только рельеф, затем другие объекты... каждый слой может храниться по-своему. Например, местность может быть сгенерирована перлин-шумом + другой слой, который можно изменить.