Как я должен отслеживать позиции игроков в режиме реального времени в MMO?

14

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

Baccari
источник

Ответы:

23

Как можно использовать файлы для отслеживания позиций игроков?

Вы записываете позицию игрока в файл. Например, если вы идентифицируете каждого игрока по уникальному номеру (или GUID), вы можете использовать его в качестве имени файла. В файле просто запишите данные о местоположении в формате, который вы сможете проанализировать позже. Например, 467239.txtможет содержать, 20, 3, 19если игрок # 467239 находится в этом ( x, y, z ) месте.

Однако это ничем не отличается от того, что вы делаете с базой данных - база данных не должна быть «медленной» при этой операции, она должна быть очень быстрой (вероятно, быстрее, чем файлы, потому что у вас больше дисковых операций ввода-вывода или блокировки ввода-вывода). конфликт - если вы сохранили несколько позиций на файл - в подходе на основе файловой системы).

Возможно, вы пытались использовать БД или файловую систему для хранения позиции игрока во время выполнения ? Вы не должны делать это вообще .

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

Но запись каждой позиции игрока в хранилище, каждое обновление не нужно и крайне неэффективно; оно никогда не будет достаточно быстрым, чтобы справиться с чем-то, напоминающим «массивные» игровые весы.


источник
1
Да, на самом деле, я сохранял положение игрока в postgreSQL во время выполнения. Но если я сохраню это в памяти сервера, как я могу обновить позицию в клиентах?
Baccari
12
Метод обновления клиента одинаков во всех случаях: сервер сообщает клиенту о своей позиции через сетевое сообщение (или, более реалистично, у клиента, который выполняет локальное предсказание, также есть локальная позиция, которая сервер проверяет и подтверждает для клиента). У вас не должно быть доступа вашего клиента к базе данных, к которой обращается сервер.
1
Я упускаю смысл говорить «делай это с файлом», только чтобы объяснить, что это на самом деле хуже, чем использовать БД, а затем объяснить, в чем реальная проблема. Зачем вам это бесполезное объяснение файла? Это только сбивает с толку случайного читателя, который никому не нужен.
о0 '.
6
В прошлом у меня был опыт, что игнорирование прямых вопросов и просто чтение лекции о том, что, по моему мнению, «правильный путь» должно быть более конфронтационным, и делает ОП менее восприимчивым к тому, чтобы его отвели от более слабой основы, их первоначальный вопрос заключается в том, исходя из, это все.
13

Позиция должна быть в ОЗУ во время использования. (например: персонаж игрока в мире) Вы не можете использовать БД в качестве оперативной памяти. Ну, вы можете, но это будет ужасно.

Вы должны сохранять позиции регулярно, но не каждый раз, когда они меняются.

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

Сохраните 30 позиций, пока есть свободное время.

Что касается клиентов. Они должны получать (соответствующие) обновления состояния игры через соединение с программным обеспечением вашего сервера. Не из БД ... Это было бы непрактично, медленно, плохо, зло, и сила будет нарушена.

койот
источник
2
И да, используйте отдельный поток, чтобы избежать ситуаций, когда база данных может блокировать оставшуюся часть игрового цикла.
Койот
4

У меня есть отдельный поток, в который я ставлю очередь, чтобы сохранять в файлы каждые 500 тиков игры. В противном случае вы должны хранить все в оперативной памяти.

Ян Макалинао
источник
4

На моем сервере я сохраняю направление игрока (вектор) и последнюю позицию, если у игрока есть скорость, я вычисляю новую позицию игроков каждые 2 секунды.

Клиент, конечно, имеет свою собственную позицию позиции и отправляет на сервер новое направление (вектор).

Сервер является ответственным за позицию и отправляет пакет позиции, если клиент переместился на определенное расстояние с момента последней проверки (это может привести к эффекту резиновой ленты, если клиент не синхронизирован).

Все это происходит в памяти, конечно.

Кристиан Флодин
источник