Ways of sychnronizing multiplayer games of various types – from dynamic “shot’ em’ ups” to strategic games featuring a few thousand units. Authoritative server, independent clients, parallel determined simulation. Non-deterministic floats, cross-platform determinism and multiplayer cross-platform game physics.
How NOT to do showcase events: Behind the scenes of Midnight Show / Andrew Ko...
2 to 1500 cross-platform multiplayer units on the map
1. От 2х до 1500 кроссплатформенных
мультиплеерных юнитов на карте
Как правильно синхронизировать мультиплеерные игры
Чому мультплеєр, завжди
біг тинг, все з практики,
динамічні ігри, шана АоЕ
3. Авторитарний сервер
Синхронизация
Событие с клиента отправляеться на сервер
Сервер подтверждает событие и отправляет
результат всем клиентам
При событии на сервере, сервер отправляет
результат всем клиентам
4. Авторитарный сервер
Когда используем:
Пошаговые игры
Операции с внутриигровыми предметами/валютой
Когда не используем:
Любая динамика
Большое количество юнитов
Нюансы
Задержка действий юзера
Нагрузка на сервер
Разработка серверной части
Лишний трафик
Чому взагалі за це згадав,
не робіть так, фізика
6. Независимая симуляция
Синхронизация:
Событие моментально исполняется на
клиенте и посылается другим клиентам
Клиенты регулярно посылают часть
своего состояния для синхронизации
Клиенты перепросчитывают симуляцию в
зависимости от времени отправки
сообщения
10. Независимая симуляция
Когда используем:
Динамичные игры с быстрой обратной связью
(шутеры, слешеры, платформеры, гонки итд)
Когда не используем:
Большое количество юнитов
Идеальная синхронизация (шутер с одним патроном)
Нюансы
Можно использовать non reliable сообщения
Физика: колизии только со статическими телами
При разработке всегда помним про синхронизацию
Секюрити
Кроссплатформенность без проблем
12. 1500 юнитов (синхронная симуляция)
Синхронизируем часы
(итерации)
Клиент отправляет событие
остальным клиентам
Событие исполняется на всех
клиентах одновременно
(та же итерация)
Каждую итерацию клиент посылает
остальным контрольную сумму
Подія-дія юзера, код
детерминирован
13. 1500 юнитов (синхронная симуляция)
Условия
Гарантируем одинаковое исполнение кода на всех клиентах
Посылаем только события сгенерированные юзером
Определяем максимальное время обратной связи
Синхронизация
Invented by AoE
14. 1500 юнитов (синхронная симуляция)
Если команда опаздывает:
Определите комфортную для геймплея задержку
Не привязывайтесь к fps
15. 1500 юнитов (синхронная симуляция)
Когда используем:
Игры с большим количеством юнитов (стратегии)
Когда не используем:
Игры с быстрой обратной связью
Нюансы
Запись игровой сессии (в том числе для дебага и геймплейных
юнит тестов(?))
Checksum error хрен отдебажишь
В разработке мало отличается от сингл плеера (если следовать
правилам)
Правила (Не используем события анимации, синхронный Random)
Очень низкий трафик
При попытке хака checksum error
18. Добавляем мультиплатформу
Floating point indeterminism
27.241412814841299999
vs.
27.241412814841200001
Intel 80 bit, different
architectures, os etc, can be
fixed with compiler
19. Добавляем мультиплатформу
Fixed point math
Используйте кроссплатформенную технологию
Вместо float используем свой тип даных
Низкая точность
Низкая производительность для некоторых операций
Невозможно использовать готовые решения (пишем свой Box2D,
path finding, ray casting, структуры данных)
Sin-lookup table, sqrt
– for, числові ряди
20. Полезные советы
Используйте reliable UDP
Cloud серверы
Не используйте P2P
Используйте protocol buffers
Продумывайте мультиплеерное взаимодействие с самого начала
Неможливо переробити
сінгл в мульти