Налаштування серверної синхронізації положень рук та голови в іграх

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

Від імерсивних застосунків до ігрових світів і 3D-сцен

Наша виділена команда для VR/AR/MR-розробки, Unity-продакшну і 3D-моделювання та анімації — з власними кейсами і презентаціями.

Відвідати персоналізований сайт
Показано 1 з 1Усі 242 послуг
Налаштування серверної синхронізації положень рук та голови в іграх
Складний
~1-2 тижні
Часті запитання

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

Які етапи розробки гри?

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

  • image_games_mortal_motors_495_0.webp
    Розробка гри для компанії Mortal Motors
    696
  • image_games_a_turnbased_strategy_game_set_in_a_fantasy_setting_with_fire_and_sword_603_0.webp
    Покрокова стратегія у фентезі сеттингу With Fire And Sword
    879
  • image_games_second_team_604_0.webp
    Розробка ігри для компанії Second term
    504
  • image_games_phoenix_ii_606_0.webp
    3D-анімація – тизер для гри phoenix 2.
    543

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 тижні

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