Ми налаштовуємо серверну синхронізацію VR-аватарів — від базових трансформів до складних колізій. Позиції рук і голови оновлюються 72–120 разів на секунду; без оптимізації трафік на 8 гравців сягає 50–100 KB/s лише на позиції. Мережева синхронізація VR потребує ретельного налаштування, а досягти плавної синхронізації без перевантаження мережі можна за допомогою ключових технік: Dead Reckoning, квантування, авторитетний сервер. Наша команда має 10+ років досвіду в геймдеві, 50+ реалізованих VR-проєктів та сертифікацію Unity і Photon. Ми надаємо гарантію на працездатність рішення протягом 30 днів після деплою. Вартість базової синхронізації — від 500$, повний пакет з оптимізацією — від 1200$.
Як працює Dead Reckoning для рук?
Техніка Dead Reckoning прийшла з морської навігації та авіасимуляторів. Для VR-аватарів вона працює так: замість позиції на кожен фрейм клієнт відправляє позицію + швидкість + кутову швидкість. Отримувач екстраполює наступну позицію на основі останнього відомого стану + фізичної моделі руху. Коли приходить наступний пакет — звіряємо з передбаченою позицією та коригуємо. Порівняно з відправкою кожного фрейму, Dead Reckoning дозволяє передавати дані в 5-10 разів рідше, що знижує частоту відправки на 70-90%.
У Photon Fusion це реалізується через кастомний NetworkBehaviour з [Networked] властивостями для позиції, ротації та похідних. Interpolation та Extrapolation налаштовуються в NetworkTransform через InterpolationDataSource:
-
Predicted— клієнт-авторитетне передбачення, мінімальна сприймана затримка для локального гравця -
Interpolated— із затримкою, але гладко для remote гравців -
Auto— Fusion обирає сам залежно від State Authority
Для рук VR принципово важливо, що Predicted режим застосовується лише до StateAuthority об'єкта. Віддалені руки завжди інтерполюються, і затримка неминуча — питання в тому, наскільки гладко вона ховається.
Що таке квантування та дельта-кодування?
Позиція руки у VR займає 3 × float32 = 12 байт. Ротація у вигляді кватерніона — 4 × float32 = 16 байт. Разом 28 байт на одну руку, 56 на дві + 28 на голову = 84 байти на гравця без урахування заголовків. Квантування знижує це до 15–20 байт на гравця — у 4–5 разів менше початкового розміру, що в 4-5 разів краще за некомпресовану передачу. Позиція в робочій зоні VR (3×3×3 м) з точністю 1 мм кодується в 15 бітів на вісь. Ротація через стиснутий кватерніон (три компоненти, четвертий відновлюється) — 10 бітів на компонент.
У Photon Fusion квантування вмикається через NetworkTransform.Precision та RotationPrecision. Для кастомних даних використовуємо INetworkStruct з ручним квантуванням через BitStream.
Дельта-кодування — наступний рівень: передаємо лише зміну відносно попереднього стану. Рука, яка не рухалася (гравець тримає об'єкт нерухомо), відправляє майже нульову дельту, яка компресується до кількох біт. На практиці для VR це дає 30–60% зниження трафіку порівняно з повними позиціями кожен тік, і є в 2-3 рази ефективніше за звичайне квантування.
Клієнтська чи серверна авторитетність: що обрати?
Це архітектурний вибір з прямими наслідками для геймплею. Клієнтська авторитетність для рук — позиція приймається як є від клієнта — мінімальна затримка, максимальна чуйність. Але відкриває можливість для читів: клієнт може надсилати «руку» в позицію, куди фізично неможливо дотягнутися.
Серверна авторитетність — сервер валідує кожне переміщення руки проти фізичних обмежень (максимальна швидкість, зона досяжності від торса) — стійка до читів, але вимагає RTT-компенсації для відчуття чуйності. Для VR-ігор без змагальної складової (спільний досвід, кооперативи) — клієнтська авторитетність з базовою серверною валідацією аномалій. Для змагальних VR — серверна авторитетність з агресивним клієнтським передбаченням та rollback.
| Параметр | Клієнтська авторитетність | Серверна авторитетність |
|---|---|---|
| Затримка | Мінімальна | Вища, потребує компенсації |
| Захист від читів | Низька | Висока |
| Де застосовувати | Кооператив, синглплеєр | Змагальні, PvP |
Деталі реалізації квантування в Photon Fusion
Для ручного квантування використовуйте `INetworkStruct` з полями типу `byte`, `short` або кастомними структурами. Наприклад, позицію можна упакувати в три `short` (15 біт + знак) і розпакувати через `BitStream.Read/Write`. Ротацію — через три `ushort` по 10 біт, відновлюючи четвертий компонент. Такий підхід дає максимальний контроль над точністю та трафіком.Як ми вирішували проблему розсинхронізації рукостискання: кейс з практики
Наш клієнт — студія, що розробляє соціальний VR-простір, — зіткнулася з проблемою: гравці «тиснуть руки», але при RTT 80–120 мс позиції розходилися на 5–12 см. Рукостискання виглядало як порожній жест у повітрі.
Рішення: спеціальний snap-протокол. Коли одна рука входить у колайдер іншої (перевіряється на сервері), сервер повідомляє обох клієнтів про подію захоплення. Обидва клієнти переходять у режим anchor: один стає ведучим, другий — веденим. Ведений інтерполює свою позицію до ведучої з Lerp по 80 мс. Візуально — плавне з'єднання без телепортації.
Відповіді на поширені запитання
Що таке Dead Reckoning і як він застосовується для синхронізації рук у VR? Dead Reckoning — техніка передбачення позиції на основі останнього відомого стану та швидкості. У VR-синхронізації клієнт відправляє позицію та швидкість, отримувач екстраполює рух, а при отриманні нового пакета коригує. Це знижує частоту відправки даних без втрати плавності.
Які методи компресії використовуються для передачі трансформів у мультиплеєрних VR-іграх? Основні методи — квантування (стиснення float32 до меншої кількості біт) та дельта-кодування (передача лише змін). Квантування позиції в робочій зоні VR до 15 біт на вісь, ротації до 10 біт на компонент. Дельта-кодування дає додаткову економію 30–60% трафіку.
Чи варто використовувати клієнтську чи серверну авторитетність для синхронізації рук? Клієнтська авторитетність дає мінімальну затримку, але вразлива до читів. Серверна авторитетність стійка до злому, але вимагає компенсації затримки. Для кооперативних VR-ігор достатньо клієнтської з базовою валідацією, для змагальних — серверна з передбаченням і rollback.
Як вирішити проблему розсинхронізації рук при взаємодіях (наприклад, рукостискання) у VR? У таких сценаріях використовується snap-протокол: сервер визначає момент контакту та переводить один з об'єктів у режим веденого з інтерполяцією до ведучого (Lerp ~80 мс). Це забезпечує плавне з'єднання без телепортації.
Які терміни розробки типової серверної синхронізації для VR-гри? Базова синхронізація трансформів на Photon Fusion або Netcode займає 1–2 тижні. Оптимізація трафіку (квантування, дельта-кодування) додає 3–5 днів. Реалізація авторитетного сервера з rollback — 3–6 тижнів. Кастомні інтерактивні механіки — від 1 до 3 тижнів додатково.
Що входить у роботу з налаштування?
Ми постачаємо повний комплект:
- Аналіз поточної мережевої архітектури та виявлення вузьких місць
- Проектування кастомного NetworkBehaviour під ваші механіки
- Реалізація з використанням квантування та дельта-кодування
- Навантажувальне тестування з симуляцією 100+ гравців
- Документація з підтримки та подальшого доопрацювання
- Підтримка протягом місяця після деплою, гарантія на працездатність — 30 днів
Процес роботи: покроково
- Аналітика — вивчаємо поточне мережеве рішення, заміряємо трафік, визначаємо вимоги до точності та затримки.
- Проектування — обираємо архітектуру (клієнтська/серверна авторитетність), визначаємо схему стиснення.
- Реалізація — пишемо код: кастомні NetworkBehaviour, квантування, дельта-кодування, snap-протокол при необхідності.
- Тестування — перевіряємо на різних RTT (20–200 мс), вимірюємо FPS budget, навантаження на сервер.
- Деплой — викочуємо на продакшн, налаштовуємо моніторинг (логіювання затримок, помилок синхронізації).
Орієнтовні терміни
| Тип задачі | Терміни |
|---|---|
| Базова синхронізація трансформів (Photon Fusion / Netcode) | 1–2 тижні |
| Оптимізація трафіку (квантування + дельта) | +3–5 днів |
| Авторитетний сервер з rollback | 3–6 тижнів |
| Кастомні взаємодії (захоплення, рукостискання) | +1–3 тижні |
Вартість базової синхронізації — від 500$, повний пакет з оптимізацією — від 1200$. Отримайте консультацію — і ми підберемо оптимальне рішення під ваш бюджет.






