Задать вопрос
@MishaXXL

Как происходит обмен с БД данными в Lineage2?

Как реализован регулярный обмен данными в играх?
В данном случае описываю игру Lineage 2.

1. Каждое открытие инвентаря это запрос к БД (т.е. при стоянии на месте и щелкая кнопку, мы будем нагружать БД запросами)?
2. Каждое выпадение золота в мир это новая запись в общую таблицу мира, что в такой-то точке есть объект "золото"?
3. Что происходит после того, когда золото было поднято, эта запись превращается в null?
4. При интенсивном обороте этих действий, как реализуется такая таблица, чтобы она не переполнялась за неделю?
5. Для игр подходит любая БД (например Postgres) или есть определенный тип игровых БД?
  • Вопрос задан
  • 258 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 2
saboteur_kiev
@saboteur_kiev Куратор тега Разработка игр
software engineer
1. Каждое открытие инвентаря это запрос к БД (т.е. при стоянии на месте и щелкая кнопку, мы будем нагружать БД запросами)?

Нет. Данные загружаются в оперативку при логине персонажа. Изменения также касаются оперативки. В базу скидывается при логауте. Ну еще периодически для синхронизации.

2. Каждое выпадение золота в мир это новая запись в общую таблицу мира, что в такой-то точке есть объект "золото"?

Да. есть объект "предмет". Есть структура "список предметов", скорее всего двухсторонний список. Он обновляется, в него добавляется, из него извлекается. Предметы в мире не записываются в базу вообще (если вы помните, при ребуте все что не в чьем-то инвентаре, пропадает. Не так уж много оперативки это занимает. Просто посчитайте.
Максимальный онлайн на шарде - 5000 игроков.
Объект - ну учитывая тип предмета, уникальный айди, разные параметры типа заточки, владельца, место, и так далее - 10-20 байт более чем достаточно. Ну давайте 50 байт возьмем, хотя на деле я уже не помню сколько там было, явно меньше.
50 байт * 5000 игроков и скажем 100 предметом у каждого - получим примерно 23 мегабайта.
Добавить клановые хроанилища. ну 30 мегабайт. Много это оперативки на сегодня? По-моему вообще разговор ни о чем.

3. Что происходит после того, когда золото было поднято, эта запись превращается в null?

Объект удаляется из списка.

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

Нет никаких проблем с тем, чтобы удалить объект и освободить память.
Для оптимизации, можно делать так, что объекты не удаляются из памяти, а "очищаются", то есть структура в памяти остается, просто ее удаляют из основного списка и добавляют в список "нулл объектов". Если их там слишком много, удаляют из памяти, при этом отдельно есть счетчик количества объектов, и если надо создать новый объект, то вместо выделения памяти просто берется уже готовая структура из соседнего списка, заполняется.

5. Для игр подходит любая БД (например Postgres) или есть определенный тип игровых БД?

Любая. В Lineage2 использовался MSSQL, в самописном народном java эмуляторе использовался mysql
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Я не специалист в играх но обычно когда хотят гарантированное время выдачи ответа -
используют key-value dbms,. Они очень хорошо масштабируются и таблица с 10
записями и таблица с 10 миллиардами записей дают примерно одинаковый отклик.

Далее - искусство разработчика - уложить действия с инвентарем и действия с балансом золота
в 1 едиснственную операцию put/get или атомарную операцию с key-value системой.

Из недостатков. Никакие сортировки и группировки использовать нелзя. Если сильно хочется
- создается 1 запись типа JSON и там уже заранее лежат отсортированные дочерние записи.
И такая запись подготавливается в фоновом режиме обычно.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы