tags: [vr-ar]
Настройка серверної синхронізації положень рук та голови у іграх
Позиції у VR оновлюються з частотою 72–120 Гц. Якщо відправляти кожен кадр всім гравцям, трафік на 8 осіб становить близько 50–100 KB/s тільки на трансформи — і це до ігрової логіки. Задача мережевої синхронізації VR-аватарів: максимальна точність рухів при мінімальному трафіку та сприйнятій латентності.
Просте рішення — NetworkTransform з Photon Fusion або Netcode for GameObjects — працює, але не оптимізовано під специфіку VR. Воно шле дані кожен FixedNetworkUpdate без урахування того, чи рухався об'єкт.
Dead Reckoning та передбачення для рук
Техніка Dead Reckoning прийшла з морської навігації та авіасимуляторів. Для VR-аватарів вона працює так: замість позиції на кожен фрейм клієнт відправляє позицію + швидкість + кутову швидкість. Одержувач екстраполює наступну позицію на основі останнього відомого стану + фізичної моделі руху. Коли приходить наступний пакет — звіряємо з передбаченою позицією та коригуємо.
У 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 байти на гравця без заголовків.
Квантизація знижує це до 3–4 байтів на компонент: позиція в робочій зоні VR (3×3×3 м) з точністю 1 мм кодується в 15 бітів на вісь. Ротація через стиснену кватерніон (три компоненти, четвертий відновлюється) — 10 бітів на компонент. Разом ~15–20 байтів на гравця замість 84.
У Photon Fusion квантизація включається через NetworkTransform.Precision та RotationPrecision. Для кастомних даних використовуємо INetworkStruct з ручною квантизацією через BitStream.
Дельта-кодування — наступний рівень: передаємо тільки зміну відносно попереднього стану. Рука, яка не рухалася (гравець тримає об'єкт нерухомо), відправляє майже нульову дельту, яка стискається до кількох бітів. На практиці для VR це дає 30–60% зменшення трафіку порівняно з повними позиціями кожен tick.
Авторитетний сервер vs клієнтська авторитетність
Це архітектурний вибір з прямими наслідками для геймплею. Клієнтська авторитетність для рук — позиція приймається як є від клієнту — мінімальна латентність, максимальна відзивчивість. Але відкриває можливість для читів: клієнт може присилати «руку» у позиції, куди фізично неможливо дотягнутися.
Серверна авторитетність — сервер валідує кожне переміщення руки проти фізичних обмежень (максимальна швидкість, зона досяжності від тулуба) — стійко до читів, але вимагає RTT-компенсації для ощущення відзивчивості.
Для VR-ігор без змаганнєвої складової (спільний досвід, кооператив) — клієнтська авторитетність з базовою серверною валідацією аномалій. Для змаганнєвих VR — серверна авторитетність з агресивним клієнтським передбаченням та rollback.
Кейс: синхронізація рукопожатття у соціальному VR
У VR-соціальному просторі вимагалася синхронізація захоплення рук між гравцями: гравці буквально «жимають руки», і це має виглядати коректно для обох. Проблема: при RTT 80–120 мс позиції рук у момент «контакту» розходилися на 5–12 см — рукопожатття виглядало як порожній жест у повітрі.
Рішення: спеціальний «snap» протокол. Коли одна рука входить у коллайдер іншої (перевіряється на сервері), сервер сповіщає обох клієнтів про подію захоплення. Обидва клієнти переходять у режим «anchor»: один стає ведучим, другий — ведомим. Ведомий інтерполює свою позицію до ведучої з Lerp протягом 80 мс. Візуально — плавне з'єднання без телепортації.
| Складність синхронізації | Орієнтовні строки |
|---|---|
| Базова синхронізація трансформів (Photon/NGO) | 1–2 тижні |
| Оптимізація трафіку + квантизація | +3–5 днів |
| Авторитетний сервер з rollback | 3–6 тижнів |
| Кастомні взаємодії (захвати, рукопожатття) | +1–3 тижні |
Вартість розраховується після аудиту поточної мережевої архітектури та вимог щодо числа гравців та жанру гри.





