Як слід відстежувати позиції гравців у реальному часі в MMO?


14

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

Відповіді:


23

Як можна використовувати файли для відстеження позицій гравців?

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

Це не так відрізняється від того, що ви робили б із базою даних, однак - при цій операції база даних не повинна бути «повільною», вона повинна бути дуже швидкою (ймовірно, швидше, ніж файли, тому що у вас є більше накладних дискових вводів IO або блокування IO суперечка - якщо ви зберігали кілька позицій на файл - у підході на основі файлової системи).

Можливо, ви намагалися використовувати БД або файлову систему для зберігання позиції гравця під час виконання ? Ви взагалі не повинні цього робити .

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

Але писати позицію кожного гравця для зберігання кожного оновлення є непотрібним і вкрай неефективним; він ніколи не буде достатньо швидким, щоб впоратися з чим-небудь, що нагадує "масивні" масштаби гравців.


1
Так, насправді я зберігав позицію гравця до postgreSQL під час виконання. Але якщо я зберігаю його в пам'яті сервера, як я можу оновити позицію в клієнтах?
Баккарі

12
Метод, за допомогою якого клієнт оновлюється, є однаковим у всіх випадках: сервер повідомляє клієнту, яка його позиція, через мережеве повідомлення (або, що більш реально, клієнт, який робить місцевий прогноз, також має локальну позицію, сервер перевіряє і підтверджує для клієнта). Ви не повинні мати свого клієнта, який має доступ до бази даних, до якої працює сервер.

1
Я сумую за те, щоб сказати "зробіть це з файлом", тільки щоб пояснити це насправді гірше, ніж використовувати db, а потім пояснити, яка реальна проблема. Навіщо потрібне в першу чергу це марне пояснення файлів? Це лише бентежить випадкового читача, який нікому не приносить користі.
o0 '.

6
У минулому я був досвід, що ігнорування прямих питань і просто переходити до лекцій про те, що, на мою думку, «правильний шлях» має бути більш конфронтаційним і робить ОП менш сприйнятливими до того, щоб керуватися подалі від слабшого фундаменту, їх початкове питання - що виходить, ось і все.

13

Позиція повинна бути в оперативній пам'яті під час використання. (напр .: персонаж гравця у світі) Ви не можете використовувати БД як оперативну пам'ять. Ну ти можеш, але це буде жахливо.

Ви повинні зберігати позиції регулярно, але не кожного разу, коли вони змінюються.

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

Збережіть 30 позицій, поки вільний час доступний.

Що стосується клієнтів. Вони повинні отримувати (відповідні) оновлення стану ігор через підключення до вашого серверного програмного забезпечення. Не від БД ... Це було б непрактично, повільно, погано, зло і сила буде порушена.


2
І так, використовуйте окремий потік, щоб уникнути ситуацій, коли база даних може блокувати решту вашого ігрового циклу.
Койот

4

У мене є окремий потік, в який я чержу, щоб зберегти у файлах кожні 500 ігор гри. В іншому випадку слід зберігати все в оперативній пам’яті.


4

Що я роблю на своєму сервері, це зберігати напрямок (вектор) гравців та останню позицію, якщо гравець має швидкість, я розраховую нову позицію гравців кожні 2 секунди.

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

Сервер є авторитетним щодо позиції та надсилає пакет позицій, якщо клієнт перемістив певну відстань з моменту останньої перевірки (це може призвести до того, що ефект гумки не синхронізується).

Все це відбувається на згадку, звичайно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.