Методи MMO, алгоритми та ресурси для збереження пропускної здатності низькою?


9

Чи є ресурси та документація про те, як поточні ММО обробляють дані про дії та рух від стиснення до обробки на клієнті? Будь-які ресурси для алгоритмів прогнозування руху?

Мене особливо цікавлять ті, хто має рух wsad і фокусується на підтримці низької затримки. Також, яка швидкість і розмір пакетів для різних типів MMO (мережева)?

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

Відповіді:


9

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

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

Є дві основні класифікації того, що ви можете зробити:

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

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

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

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

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


1
Також є продовження першої книги (Massively Multiplayer Game Development 2). На мою думку, це не дуже корисна серія книг (це, безумовно, не книга, що починається до кінця, щоб зробити «MMO-в-х-годинах», як це більшість книг для розробників ігор), але вона обговорює деякі теоретичні проблеми задали в цьому питанні. І, можливо, це було б корисніше тому, у кого вже є розроблений MMO.
Ricket

5

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


4
Я повторю, що якщо ви використовуєте диференційне оновлення (зазвичай двійкові відмінності в ігрових структурах) і ви використовуєте що-небудь із доставкою поза замовленням (надійною чи ні), ви пошкодуєте про це. Люди, які не люблять TCP в іграх, як правило, просто недостатньо знають про це (наприклад, знаючи, що робить NODELAY). UDP має сенс для таких речей, як голосові дані, де пакети поза замовленнями можуть бути просто скинуті, це рідко трапляється в грі.
кодеранж

1
"рідко буває в грі"? За умови, що сервер дає мені авторитетні ігри, кожен стан кадрує, мені байдуже, що відбувалося в минулому. Для цього ідеально підійде простий монотонно зростаючий номер кадру з UDP-пакетів. Скільки даних вам потрібно надійно передати?
ChrisE

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

1
Навіть якщо надіслати повний стан речей, що змінюються, у вас виникають проблеми з доставкою поза замовлення, коли об'єднання речей може стати нездійсненним. Подумайте про оновлення "x = 1, y = 2", а потім "y = 1, z = 2". Якщо вони повертаються назад, ви хочете скинути "перше", щоб значення y було правильним, але тоді ви втрачаєте зміну на x.
кодерангер

1
@Adam Ось чому я сказав, що вам слід прочитати специфікацію TCP і зрозуміти, як працює масштабування вікон і як воно взаємодіє з повторною передачею ;-) Переписування TCP в основному завжди неправильне, шанси накрутити його майже 100%. Якщо ви хочете отримати надійну замовлення, ви не повинні використовувати UDP.
кодеранж
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.