Я підходжу до цього з обговорення на високому рівні, а потім працюю над вашими питаннями. Заради розкриття, у мене немає особистого досвіду використання socket.io, але дуже багато впливу на проблемний простір щодо MMORPG.
Дизайн мережевої архітектури двигуна MMORPG та / або вибір проекту середнього посуду або з відкритим кодом для забезпечення функціональності є одним із найбільш складних рішень, на які впливає ігровий дизайн, бюджет та технічна експертиза команди. Остаточний вибір впливатиме на інші архітектурні рішення (а іноді і на дизайнерські рішення).
Як розробники MMORPG, ми плануємо великий успіх (часто також відомий як катастрофічний успіх), коли велика кількість спрацьовує попереджувальних ламп та сирен. Одне із страшно великого числа, яке з'являється, полягає в алгоритмах, які мають N-квадрат (далі N ^ 2), у вашому питанні перше, що вискочило для мене, це те, що це звучало як дизайн, який вимагає від суб'єкта господарювання передавати інформацію до всі інші пов'язані об'єкти. Це класичний приклад задачі N ^ 2.
ЗМО зазвичай підходять до вирішення N ^ 2 питань шляхом атаки на проблему декількома різними способами; системи обізнаності (ситуаційні, просторові тощо), коли суб'єкт господарювання обізнаний про деякий підмножина всіх інших об'єктів, розподіляє гравців на різні "осколки", розподіляє гравців на "зони" та / або інстанціює, застосовуючи ігрову механіку, яка відбиває занадто багато гравці разом збираються (шторми телепорту Asheron Call) тощо.
Більшість MMORPG та багато FPS двигунів мають досить складну мережеву архітектуру, яка підтримує різноманітні функції, зокрема:
- надійні та ненадійні комунікаційні шляхи (TCP, спеціальна реалізація надійних пакетів UDP та UDP)
- формування пропускної здатності (пріоритетність, тривалість життя тощо)
- автоматична реплікація польових / життєздатних викликів даних та функцій
- атомні набори даних (тобто дані, які передаються разом)
- дискретні оновлення (тобто, де важливий кожен перехід)
- корекція затримки
- різноманітні хитрощі, щоб клієнт почував себе чуйним
Я вважаю, що документація нереальної мережевої документації та мережева документація з клапанами забезпечують хорошу грунтовку з різних питань.
Отже, тепер давайте підійдемо до питань.
Було б кращою ідеєю "збирати" їх і транслювати, скажімо, раз у 1/10 секунди?
Тут важко надати просту відповідь "так" або "ні" ... тому що це залежить від масштабу (кількість спостерігаючих організацій), частоти оновлень та розміру оновлень. Наприклад, збирання їх усіх може бути жахливо помилковим, якщо розмір оновлень десь може підірвати буфер.
Клієнт для MMORPG і FPS ігор, як правило, розроблений таким чином, що вони візуалізують щось, що "виглядає" правильно, навіть якщо вони не отримують оновлення для набагато більше кадрів оновлення, ніж це "нормально". Використовуючи ненадійну комунікацію (UDP), ви можете просто розраховувати втратити деяку кількість оновлень у порожнечу, клієнти можуть компенсувати це, надсилаючи більш часті оновлення, ніж це може бути використано при надійному транспорті.
З короткого огляду документації на socket.io, схоже, вона підтримує надійні та ненадійні (нестабільні у своїй термінології) шляхи зв'язку.
Я б підійшов до цього спочатку, вирішивши, на якій частоті потрібні оновлення ...
Якщо гравець рухається по прямій лінії з постійною швидкістю, нижча частота оновлення нормально, тому що спостережуючі клієнти можуть з високою точністю передбачити, де гравець буде в будь-який момент часу. Коли гравець обертається в тісному колі або робить швидкі зміни напрямку, тоді потрібні набагато частіші оновлення. І навпаки, коли гравець взагалі не рухається, взагалі немає причин надсилати оновлення руху.
Незважаючи ні на що, мабуть, не потрібно (як правило) надсилати оновлення кожного кадру від клієнта на сервер. Сам сервер може вирішити надсилати повідомлення кожному кадру там, де він є, або затримувати їх (див. Формування пропускної здатності, встановлення пріоритетів та час оновлення).
Інші типи оновлень мають різні характеристики ... наприклад, враховуйте поле "здоров'я", яке змінюється при пошкодженні гравця чи істоти. Один із способів реалізувати це - це трансляція кожної зміни негайно, коли це відбувається, але це призводить до втрати часу обробки та пропускної здатності, якщо значення змінюється кілька разів у кадрі або послідовних кадрах (мережеві архітектури, що реалізують форму пропускної здатності, вирішують цю проблему шляхом об'єднання оновлень у лише спостережуваному клієнту надсилається лише останній, коли він має доступну пропускну здатність).
чи повинен клієнт надсилати багато різних повідомлень (отримані досвіду, натиснуті на товар), як тільки вони з’являються, а точніше лише одне зібране?
Знову ж таки, тут не спрацює жоден простий відповідь "так" чи "ні". Залежно від того, що саме ви маєте на увазі під зібраним ... обидва можуть бути правильними за різних обставин, а також залежати від реалізації мережевого шару.
Збір повідомлень для певного об'єкта, що надсилається як одне повідомлення, може (залежно від реалізації) зменшити накладні витрати на передачу повідомлення (зменшити ваші витрати) навпаки (залежно від реалізації, наприклад, відображення поля / значення, передані рядками), може збільшити пропускну здатність. вимоги порівняно з більш простим конкретним типом повідомлення.
Переглядаючи документацію на socket.io, мені здається, що накладні повідомлення знаходяться на верхньому кінці спектру, що сприятиме збору оновлень для надсилання у вигляді сукупного повідомлення на відміну від безлічі одиничних оновлень.
Я рекомендую переглянути всі оновлення, про які ви плануєте реплікувати, наприклад, більшість MMORPG та FPS не намагаються надсилати гравця, натиснутого на X події, спостереженням за клієнтами, якщо це не призведе до зміни стану об'єкта, про який вони також знали. .