Краща архітектура гри однорангових


10

Розгляньте налаштування, де клієнти ігор:

  1. мають досить невеликі обчислювальні ресурси (мобільні пристрої, смартфони)
  2. всі підключені до загального маршрутизатора (локальної мережі, точки доступу тощо)

Користувачі хочуть грати в багатокористувацьку гру без зовнішнього сервера.

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

Отже, я хочу розробити однорангову архітектуру, яка розподілить імітаційне навантаження гри серед клієнтів. Через пункт 2 система не повинна бути складною щодо оптимізації; затримка буде дуже низькою. Кожен клієнт може бути авторитетним джерелом даних про себе та своє безпосереднє оточення (наприклад, куль.)

Який найкращий підхід до проектування такої архітектури? Чи є відомі приклади такого протоколу рівнів-рівних LAN-рівня?

Примітки:

Деякі проблеми вирішуються тут , але перераховані тут концепції для мене занадто високі.

Безпека

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

Редагувати:

Я забув згадати: це буде досить швидка гра (шутер).

Також я вже читав про мережеві архітектури в Gaffer on Games .

Відповіді:


10

Погляньте на цю статтю про мережеву архітектуру Age of Empires II.

Їм вдалося створити багатокористувацьку гру, яка чудово працювала на Pentium 90 з 16 Мб оперативної пам’яті та 28,8 кБ / с підключенням до модему. Вони зробили це за допомогою кожного гравця запустити своє моделювання, але синхронізувати свої команди.

У них є якісь хитрі хитрощі, я дуже рекомендую це.


5

Я зробив це для комерційної гоночної гри PSP, яка працювала як через спеціальну мережу, так і через бездротову точку доступу. (Або на статичний сервер в Інтернеті, за бажанням)

Через пункт 2 система не повинна бути складною щодо оптимізації

На мій досвід, це неправда. Бездротові пристрої (особливо маленькі портативні) не схожі на комп’ютери з дротовим мережевим підключенням - для ігор смартфони та бездротові ігрові консолі, як правило, мають повільний мережевий інтерфейс.

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

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

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

Кожен клієнт може бути авторитетним джерелом даних про себе та своє безпосереднє оточення (наприклад, куль.)

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

Це насправді напрочуд складні переговори між гравцями, де гра 'a' пропонує грати 'b': "Я думаю, цей об’єкт вам ближче. Ви повинні взяти під нього контроль". І тоді гра 'b' може або приймати, або може відмовитися, виходячи з власного погляду на ситуацію. Різниця в сприйнятому ігровому стані між 'a' і 'b', і зміна часу, коли запит і відповідь надсилаються і отримуються, робить це особливо неприємним переговором, щоб отримати надійність, і він може легко перерости в гру "гаряча картопля", причому право власності на об'єкти постійно підстрибує між кількома гравцями. І навіть коли вона працює належним чином, якщо дивитися з точки зору гри "c", там "

Моя інтуїція полягає в тому, що такий підхід "власності на об'єкти", ймовірно, буде занадто громіздким для невеликих, короткотривалих об'єктів, як кулі. Ми використовували його для легкових автомобілів та гонщиків AI, які, як правило, живуть в симуляції порівняно довго. Здається, що більш підходящим підходом, якщо ви готові довіряти клієнтам, було б мати гру кожного гравця власну позицію та свої снаряди та заявити, коли цього гравця вдарив чужий снаряд. (Отже, як "гра А", я відповідаю за те, де знаходяться снаряди гравця A та гравця A, але гравець B відповідає за те, чи я потрапив у гравця B). Маючи добрі рахунки з мертвими, ви повинні мати можливість отримати досить розумну поведінку із такої системи.


1

Я рекомендую вам використовувати рівну схему блокування для архітектури однорангових.

Ви починаєте з підрахунку ігрових кадрів після початку гри. Один клієнт надає 1-й кадр, після чого надсилає готове повідомлення іншим клієнтам і чекає отримання готового повідомлення від інших клієнтів.

Тепер усі клієнти можуть перейти на другий кадр. Візуалізуйте кадр, відправляйте та отримуйте команди, світ оновлень, оновлюйте фізику і ... після цього надсилайте готові повідомлення один одному.

Це рішення дуже добре для локальних ігор, і всі ваші клієнти будуть синхронізовані.

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

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


1
Здається, ця відповідь стосується циклу гри. Я думаю, що ОП запитує про систему розподілу навантаження; конкретно, хто імітує, що і як спілкуються клієнти. Не могли б ви детальніше розібратися? Мене також цікавить ця проблема.
Вакідев

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

Тож будь ласка, поставте це у своїй відповіді. Зараз я не думаю, що це відповідає на питання. Також видаліть перший повторюваний коментар. Дякую. Що стосується самої ідеї, чи не перший варіант, який ви перерахували, не вимагає, щоб моделювання було детермінованим?
Вакідев
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.