Ответы:
Как можно использовать файлы для отслеживания позиций игроков?
Вы записываете позицию игрока в файл. Например, если вы идентифицируете каждого игрока по уникальному номеру (или GUID), вы можете использовать его в качестве имени файла. В файле просто запишите данные о местоположении в формате, который вы сможете проанализировать позже. Например, 467239.txt
может содержать, 20, 3, 19
если игрок # 467239 находится в этом ( x, y, z ) месте.
Однако это ничем не отличается от того, что вы делаете с базой данных - база данных не должна быть «медленной» при этой операции, она должна быть очень быстрой (вероятно, быстрее, чем файлы, потому что у вас больше дисковых операций ввода-вывода или блокировки ввода-вывода). конфликт - если вы сохранили несколько позиций на файл - в подходе на основе файловой системы).
Возможно, вы пытались использовать БД или файловую систему для хранения позиции игрока во время выполнения ? Вы не должны делать это вообще .
Во время выполнения на вашем сервере позиции игрока должны храниться в памяти и обновляться там, как вы это делали бы в любой другой игре. Периодически они могут быть сохранены на диск или в другое постоянное хранилище - например, когда проигрыватель отдыхает, сохраняет данные или выходит из системы.
Но запись каждой позиции игрока в хранилище, каждое обновление не нужно и крайне неэффективно; оно никогда не будет достаточно быстрым, чтобы справиться с чем-то, напоминающим «массивные» игровые весы.
Позиция должна быть в ОЗУ во время использования. (например: персонаж игрока в мире) Вы не можете использовать БД в качестве оперативной памяти. Ну, вы можете, но это будет ужасно.
Вы должны сохранять позиции регулярно, но не каждый раз, когда они меняются.
Я бы также не стал сохранять все позиции одновременно. Если вы хотите сохранить постоянство в случае сбоя сервера, вам следует сохранять позицию как можно чаще, но в свободное от игры время. Просто сделайте это партиями.
Сохраните 30 позиций, пока есть свободное время.
Что касается клиентов. Они должны получать (соответствующие) обновления состояния игры через соединение с программным обеспечением вашего сервера. Не из БД ... Это было бы непрактично, медленно, плохо, зло, и сила будет нарушена.
У меня есть отдельный поток, в который я ставлю очередь, чтобы сохранять в файлы каждые 500 тиков игры. В противном случае вы должны хранить все в оперативной памяти.
На моем сервере я сохраняю направление игрока (вектор) и последнюю позицию, если у игрока есть скорость, я вычисляю новую позицию игроков каждые 2 секунды.
Клиент, конечно, имеет свою собственную позицию позиции и отправляет на сервер новое направление (вектор).
Сервер является ответственным за позицию и отправляет пакет позиции, если клиент переместился на определенное расстояние с момента последней проверки (это может привести к эффекту резиновой ленты, если клиент не синхронизирован).
Все это происходит в памяти, конечно.