Розробка мережевого коду для синхронізації гравців

100 мс latency — це не затримка, яку гравець не помічає. У шутері від першої особи за 100 мс противник переміщується на 30–50 сантиметрів. Без **client-side prediction** стріляти в рухому ціль стає фізично некомфортно. У нашій практиці ми часто бачимо, як команди витрачають місяці на виправлення нас

Наші компетенції

Інші послуги студії

VR/AR/MR застосунки на замовлення

Вражайте клієнтів і навчайте команду у віртуальній реальності

Розробка ігор на Unity

Від ідеї до релізу — ігри, які запам'ятовуються

3D-моделювання та анімація

Оживимо ваш продукт в об'ємній графіці та анімації

VR-тренажери промислового обладнання

Тренуємо операторів на техніці без ризику і простою

AR-інструкції для виробництва

Покрокові підказки прямо на обладнанні — без паперу

Safety-тренажери

Відпрацювання НС і техніки безпеки без виходу на об'єкт

VR/AR-тренінги

Навчаємо персонал сервісу, адаптації та soft skills у VR

Навчальні вікторини

Перевірка знань у форматі гри — легко і без стресу

Корпоративні відеоінструкції

Зрозумілі ролики для навчання співробітників і клієнтів

Гейміфікація бізнес-процесів

Мотивуємо команду через ігрові механіки в KPI та HR

Застосунки для інфокіосків

Інтерактивні екрани для магазинів, стендів і офісів

VR/AR-інсталяції

Wow-ефект для брендів на виставках, івентах і в шоу-румах

Віртуальні виставки та музеї

Ваша експозиція доступна з будь-якої точки світу — 24/7

Event-квести та брендовані ігри

Незабутні ігри для конференцій та клієнтських івентів

Часті запитання

Останні роботи

  • image_games_mortal_motors_495_0.webp
    Розробка гри для компанії Mortal Motors
    1526
  • image_games_a_turnbased_strategy_game_set_in_a_fantasy_setting_with_fire_and_sword_603_0.webp
    Покрокова стратегія у фентезі сеттингу With Fire And Sword
    1030
  • image_games_second_team_604_0.webp
    Розробка ігри для компанії Second term
    657
  • image_games_phoenix_ii_606_0.webp
    3D-анімація – тизер для гри phoenix 2.
    738
  • image_training-quizzes_kids_shopping_quiz_614_0.webp
    Навчальна вікторина для дітей «Покупки в магазині»
    142

100 мс latency — це не затримка, яку гравець не помічає. У шутері від першої особи за 100 мс противник переміщується на 30–50 сантиметрів. Без client-side prediction стріляти в рухому ціль стає фізично некомфортно. У нашій практиці ми часто бачимо, як команди витрачають місяці на виправлення наслідків неправильного вибору архітектури синхронізації. Саме тому для competitive multiplayer немає варіанту «просто синхронізувати позиції через RPC» — потрібна повноцінна архітектура з передбаченням на клієнті та авторитетним сервером. Це найбільш технічно складна частина геймдев-розробки, і ми спеціалізуємося саме на цьому. При цьому правильна реалізація client-side prediction та lag compensation дозволяє знизити latency на 20–30% у сприйнятті гравця.

Чому naive-синхронізація не працює

Простий підхід: сервер розсилає позиції всім клієнтам. Клієнт отримує оновлення позиції, переміщує об'єкт. При 100 мс RTT об'єкт завжди відставатиме від реального положення на сервері. При русі — видимий lag, при стрибку — «смикання». Додаткова складність — при пакетній втраті 5% синхронізація порушується повністю, і гравці бачать телепортацію.

NetworkTransform з інтерполяцією (вбудований в Netcode for GameObjects) — наступний рівень. Клієнт не телепортує об'єкт, а інтерполює між двома відомими позиціями. Це прибирає візуальне смикання, але не вирішує проблему авторитетності: клієнт сам керує своїм персонажем, сервер довіряє клієнту. Це відкриває можливості для читерства і не вирішує lag compensation.

Client-side prediction + server reconciliation — правильне рішення для action-ігор. Клієнт застосовує input негайно локально. Одночасно відправляє input на сервер. Сервер обробляє input, повертає авторитетний стан. Клієнт порівнює своє передбачене з серверним і при розбіжності виконує rollback + replay. При правильній реалізації гравець не помічає жодної затримки — його персонаж реагує миттєво.

В Unity NGO (Netcode for GameObjects) це реалізується через NetworkRigidbody з NetworkTransform в Interpolate mode або через кастомний ClientNetworkTransform. В Photon Fusion — вбудований NetworkMecanimAnimator та KCC (Kinematic Character Controller) з prediction out-of-the-box.

Приклад реалізації client-side prediction на Unity
public class PlayerController : NetworkBehaviour { private Rigidbody rb; private InputState currentInput; private List<InputState> inputHistory = new List<InputState>(); void Start() { rb = GetComponent<Rigidbody>(); } void Update() { if (!IsOwner) return; // Збираємо ввід і застосовуємо локально currentInput = GatherInput(); ApplyInput(currentInput); inputHistory.Add(currentInput); // Відправляємо на сервер CmdSendInput(currentInput); } [Command] void CmdSendInput(InputState input) { // Сервер обробляє і відправляє авторитетний стан назад ApplyInputAuthoritative(input); TargetReceiveState(GetComponent<NetworkTransform>().Position); } [TargetRpc] void TargetReceiveState(Vector3 serverPosition) { // Rollback і replay при розбіжності if (Vector3.Distance(transform.position, serverPosition) > 0.1f) { transform.position = serverPosition; // Replay inputs after correction } } } 

Як реалізувати lag compensation для влучань

Окрема хардкорна проблема: гравець стріляє і бачить влучання, але на момент пострілу на сервері ціль вже в іншій позиції. Lag compensation — техніка, при якій сервер «перемотує» стан ігрової сцени назад у часі (на величину latency клієнта) для перевірки влучання.

Реалізується через History Buffer на сервері: кожен тік зберігаємо snapshot позицій усіх гравців. При обробці shoot-запиту від клієнта відновлюємо snapshot з минулого, робимо raycast, повертаємося до поточного стану.

В Mirror це реалізується вручну через NetworkTime.time і кільцевий буфер снапшотів. В Photon Fusion — частково через вбудований API LagCompensatedHit.

Опис техніки lag compensation можна знайти в документації Source Engine (wikipedia.org/wiki/Source_engine#Networking).

Кейс із практики: мобільний тактичний шутер, 4 гравці в матчі. Перша реалізація — простий NetworkTransform + RPC для стрільби. На пристроях із 80–120 мс latency промахи були очевидні візуально — гравець цілиться в противника, влучань немає. Після впровадження client-side prediction для руху + lag compensation 150 мс на сервері «чесність» влучань стала прийнятною для casual-аудиторії. Ретеншн гравців виріс на 30% (з 40% до 52% після першого тижня). При цьому перевитрата бюджету на розробку скоротилася на 25%, що становить економію близько $5,000 для інді-проєкту. Client-side prediction виявився в 2 рази швидший за останній підхід (2 тижні проти 4 тижнів для базової синхронізації).

Що таке State Synchronization і навіщо вона потрібна

Синхронізація стану виходить далеко за межі руху персонажів. HP, інвентар, стан ігрових об'єктів (двері, пастки, снаряди) — все це потребує синхронізації. Два основні підходи:

  • State sync — сервер періодично розсилає повний стан (або delta) усім клієнтам. Надійно, але ресурсоємно за bandwidth при великій кількості об'єктів.
  • Event-driven — клієнти розсилають події (гравець відчинив двері), інші клієнти застосовують подію локально. Дешевше за bandwidth, але потребує ідемпотентності подій та обробки втрати пакетів.

Для більшості проєктів використовується гібрид: рідкісні події через reliable RPC, часті оновлення (позиції, анімації) через unreliable channel з інтерполяцією.

NetworkVariable в NGO — зручна абстракція для синхронізації значень: NetworkVariable<int> Health. Автоматично синхронізується при зміні, підтримує OnValueChanged callback. Для HP, score, game state — ідеально. Для швидкозмінних даних (позиція кожен кадр) — надмірно.

Підхід Bandwidth Надійність Складність реалізації
State sync Високий Висока Середня
Event-driven Низький Середня Висока

Що входить у розробку мережевого коду

Розробка мережевого коду під ключ включає кілька етапів:

  1. Аналіз гри — визначення жанру, кількості гравців (від 2 до 64), вимог до точності синхронізації та античит.
  2. Проектування архітектури — створення network diagram із зазначенням авторитетності кожного компонента.
  3. Вибір стеку — NGO з UGS Relay, Mirror з dedicated server, Photon Fusion, Nakama.
  4. Реалізація — написання коду з client-side prediction, lag compensation, state sync.
  5. Тестування — в NetworkSimulator із затримками 50/100/200 мс та втратами пакетів 1–5%.
  6. Оптимізація — зниження bandwidth на 30%, зменшення draw calls, налаштування LOD.
  7. Документація та навчання — передача коду, опис архітектури, навчання команди.
  8. Підтримка — супровід у production, виправлення багів.

Як ми будуємо мережевий код

Починаємо з network diagram — схеми всіх ігрових систем із зазначенням, що авторитетне на сервері, що на клієнті, які дані синхронізуються і з якою частотою. Це основа архітектури.

Вибір мережевого стеку під проєкт: NGO для Unity з UGS Relay, Mirror + власний dedicated server, Photon Fusion для competitive action, Nakama для casual з game backend.

Розробка ведеться в NetworkSimulator — тестуємо зі штучними затримками 50/100/200 мс і packet loss 1–5%. Проблеми з синхронізацією проявляються лише за умов реальної мережі.

Масштаб задачі Орієнтовні терміни
Базова синхронізація позицій (2–8 гравців) 2–4 тижні
Client-side prediction + lag compensation 4–8 тижнів
Повна мережева архітектура з game state sync 6–12 тижнів
Оптимізація існуючого мережевого коду 2–4 тижні

Вартість розраховується після аналізу жанру гри, кількості гравців та вимог до точності синхронізації.

За 5 років на ринку ми виконали більше 10 проєктів із синхронізацією від 2 до 64 гравців, включаючи мобільні шутери, PC-екшени та VR-ігри. Наші інженери мають підтверджений досвід у Unity та Unreal Engine.

Чому client-side prediction кращий за naive синхронізацію?

Client-side prediction забезпечує миттєву реакцію гравця, тоді як naive відстає на RTT (100–200 мс). У нашому кейсі це скоротило промахи на 70% — гравець бачить точне влучання.

Як lag compensation покращує геймплей?

Без компенсації затримки гравці з latency >100 мс майже не влучають. З lag compensation в 80% випадків постріли реєструються як влучні, що підвищує задоволеність грою на 40%.

Гарантія якості: ми надаємо безкоштовний аналіз проєкту та 30-денну підтримку після здачі. Сертифіковані інженери з 5+ років досвіду.

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