Как работает нетворк в ко-оп играх
Раз уж вы накидали столько 🔥, то расскажу подробнее про сетевую логику и нюансы, которые я понял пока в этом разбирался.
Для меня в понимании нетворк логики были ключевыми вот эти три аспекта:
1. У каждого игрока - своя версия игры
Главное что надо понимать: нет какого-то "единого пространства" куда игроки виртуально подключаются, как условно матрица. У каждого запущена своя версия игры, и между ними бывают различия - иногда небольшие, иногда существенные. Один игрок может вообще не знать что лежит в инвентаре другого. Анимация или vfx у одного могут выглядеть не так как у другого. И тд.
Задача сетевого кода как раз "подружить" эти версии и синхронизировать их так, чтобы различия не влияли на геймплей и не замечались игроками. Но сами различия все равно будут.
2. У кого авторитет?
Кто решает было ли попадание, открылась ли дверь, хватает ли монет - клиент игрока или сервер? Обычно в большинстве вещей авторитет у сервера: он определяет что произошло и просто уведомляет об этом клиентов. Минус — небольшая задержка.
Поэтому там где нужна отзывчивость (например движение своего персонажа) используют клиентское предсказание: клиент сразу двигает персонажа локально не дожидаясь сервера, и параллельно шлёт действие на сервер. Сервер всё равно остаётся главным - если его версия отличается, клиент откатывается и подгоняется под серверное состояние.
В итоге типичный сценарий: клиент шлёт запрос ("могу открыть дверь?"), сервер проверяет условия (есть ли ключ, не заперта ли) и рассылает всем эвент "дверь открывается".
В исключительных случаях авторитет именно у клиента без предсказания (например, запустить определенную эмоцию персонажа или отправить в чат сообщение)
3. Что синхронизировать, а что нет
Если синкать вообще всё - получите огромный лаг и забьёте канал, тк у соединения есть ограниченная пропускная способность. Поэтому обычно разделяют:
• Логика - синхронизируется (дверь открылась, попадание случилось)
• Визуал - живет только локально у каждого (анимация открытия, vfx, партиклы)
Пример из наших прототипов - рэгдолл. Изначально я пробовал прототип где синхронизировалось положение всех костей всех персонажей. Очень быстро это стало неработающим лагающим ужасом :).
Поэтому рэгдолл по сути стал vfx - он не синхронизируется и существует только локально у каждого игрока. Синкаются только позиция рута игрока, сила удара, вектор и точка попадания - дальше у каждого отрабатывает само.
Также не синкается то что другим игрокам просто не нужно - например сколько у кого монет (если их нельзя украсть). Об этом знает только сам игрок и сервер.
P.S. Уважаемые разработчики, прошу с пониманием отнестись к упрощениям в тексте 🙂
Post #30
575
- 👍 14
- 🔥 8
- 😎 1