Як побудувати простий ігровий сервер для багатокористувацької гри?


9

Я хотів би створити простий багатокористувацький ігровий сервер для простої гри:

Гра повинна бути схожа на Command & Conquer, у вас є кілька танків і кілька солдатів. Ви можете вибрати одного солдата і потім натиснути на карту, куди повинен піти солдат. Якщо солдат приходить у місцевість, куди не міг поїхати, він гуляє. І солдати можуть бути збиті ворогами.

Як я повинен структурувати ігровий сервер і що робити у клієнта?

Тобто, якщо солдат рухається від X до Y, але навколо будівлі Z, я думаю, сервер повинен бути в змозі обчислити, де саме знаходиться солдат (на випадок, коли ворог вистрілив у нього), і клієнт також повинен знати позицію для малювання солдата.

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

Відповіді:


12

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

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

Я не можу точно сказати, як вирішити це для RTS. Що ми робимо для нашого запуску FPS, це сервер зберегти повний світовий стан назад і дозволити клієнтові позначити часові позначки кожен кадр. Коли мережеве повідомлення для "Я звільнив!" доходить до сервера, сервер може відкотити світ і зробити тести зіткнення тощо у світі, "як це шукав клієнт, коли вистрілив кадр".

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

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

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


1
Насправді є три (а може і більше) суперечливих цілей. Третє - це продуктивність, зберігання та оновлення стану гри в режимі реального часу повністю на сервері, використовує багато ресурсів.
Барт ван Хекелом

2
О, і ви легко можете вирішити номер 2, ввівши штучне відставання, рівне середньому відстанню інших гравців. Добре, якщо ви можете назвати рішення "зробити це поганим для всіх", тобто.
Барт ван Хекелом

@Bart: частково правда, але, звичайно, має бути обмежена кількість затримок, які ви штучно впроваджуєте, або повільніші з’єднання можуть постійно змушувати швидкі зв'язки занадто сильно відставати, що, безумовно, зараз те, що ви хочете.
o0 '.

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

2

В основному є два підходи:

  1. Довірений клієнт
  2. Недовірливий клієнт

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

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

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


Дякую, це було інформативно. Я думаю, що я піду для недовірених клієнтів і виконую обов'язки роботи на сервері. У мене не буде багато гравців на початку.
Йонас

1
"У мене не буде багато гравців ..." Я не можу порахувати кількість розробників, які дали мені цю лінію і повернулися через шість тижнів: "У мене є 5000 гравців, які хочуть платити за свою гру, але я не можу масштабувати :( ". Майте це на увазі!
Андреас

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