Варианты хранения огромной карты тайлов

Я создаю псевдо-пошаговую браузерную онлайн-стратегию, в которой многие люди играют в одном мире в течение длительного периода (месяцев). Для этого я хочу иметь карту размером 64000x64000 плиток = 4 миллиарда плиток. Мне нужно около 6-10 байт данных на плитку, что составляет около 30 ГБ данных для хранения карты.

У каждой плитки должны быть такие свойства, как тип (вода, трава, пустыня, гора), ресурс (дерево, коровы, золото) и playerBuilt(дорога, здание)

Клиенту когда-либо понадобится доступ только к 100x100 плиткам одновременно.

Я обработал карту на стороне клиента под контролем. Проблема, с которой я столкнулся, заключается в том, как хранить, извлекать и изменять информацию из этой карты на стороне сервера.

Требуемая функциональность:

  1. Создать, сохранить и изменить 64000x64000 тайловую карту.
  2. Покажите клиенту 100х100 часть карты.
  3. Внесите изменения в карту, такие как дороги, здания и истощенные ресурсы.

Что я учел до сих пор:

  1. Процедурная генерация: Процедурная генерация любой части карты, необходимой на лету. Убедившись, что при наличии одного и того же семени, он всегда генерирует одну и ту же карту. Основная проблема, с которой я столкнулся, заключается в том, что во время игры на карту будут вноситься изменения. Примечание. Менее 1% плиток будет изменено во время игры, и можно будет хранить изменения с координатами во внешнем массиве. Загрузка их поверх процедурного поколения.
  2. Базы данных: создание карты в начале игры и сохранение ее в базе данных. Друг посоветовал мне отказаться от такой огромной карты тайлов и сказал, что я, вероятно, захочу хранить ее в памяти.
  3. Хранение всего этого в памяти на стороне сервера: Хранение этого в памяти в структуре данных. Похоже, хороший способ сделать это, если карта была меньше, но для 4 миллиардов плиток было бы много, чтобы сохранить в памяти.

Я планировал использовать java+mysql для серверной части этого проекта. Я все еще на ранних стадиях и могу изменить технологию, если это необходимо.

Мой вопрос: какой из трех подходов, представленных выше, кажется жизнеспособным и / или есть ли другие способы сделать это, которые я не рассматривал?

1 ответ

Зависит от:

  • сколько оперативной памяти у вас есть (или у игрока / пользователя)
  • Является ли большая часть карты тайлов пустой? Напротив плотный.
  • Есть ли местность по умолчанию (например, пусто или вода?)

Если разрежено, используйте хэш-карту вместо 2D-массива.

Если он плотный, он будет намного сложнее, и вам может понадобиться использовать базу данных или некоторые специальные структуры данных + кэш. Вы можете обнаружить горячие зоны и некоторое время хранить их в памяти, мертвые зоны (нет игроков, нет активности...) могут храниться в базе данных и считываться по требованию. Вы также можете загружать данные в несколько проходов: сначала только рельеф, затем другие объекты... каждый слой может храниться по-своему. Например, местность может быть сгенерирована перлин-шумом + другой слой, который можно изменить.

Другие вопросы по тегам