Maryna Sokyrko & Oleksandr Chugui: Building Product Passion: Developing AI ch...
Максим Гринів “Правильна розробка мультиплеєру”
1. Від 2х до 1500 кросплатформених
мультиплеєрних юнітів на карті
Як правильно синхронізувати мультиплеєрні ігри
Чому мультплеєр, завжди
біг тинг, все з практики,
динамічні ігри, шана АоЕ
3. Авторитарний сервер
Синхронізація
Подія з клієнта відправляється на сервер
Сервер підтверджує подію і відправляє результат
всім клієнтам
Сервер генерує події та відправляє клієнтам
4. Авторитарний сервер
Коли використовуємо:
Покрокові ігри
Операції з внутрішньо-ігровими предметами, валютою
Локальний мультиплеєр
Нюанси
Затримка дій юзера
Нагрузка на сервер
Розробка серверної частини гри
Лишній трафік
Чому взагалі за це згадав,
не робіть так, фізика
Коли не використовуємо:
Будь-яка динаміка
Велика кількість юнітів
Великий пінг
6. Незалежна симуляція
Синхронізація:
Подія моментально виконується на
клієнті та відсилається іншим клієнтам
Клієнти регулярно посилають частину
свого стану для синхронізації
Клієнти можуть перераховують симуляцію
якщо приходять повідомлення «з
минулого»
10. Незалежна симуляція
Коли використовуємо:
Динамічні ігри з швидким зворотнім звязком
(шутери, слешери, платформери, гонки ітд)
Нюанси
Можна використовувати non reliable повідомлення
Фізика: колізії тільки зі статичними тілами
При розробці завжди памятаємо за синхронізацію
Security
Кросплатформеність без проблем
Коли не використовуємо:
Велика кількість юнітів
Ідеальна синхронізація (шутер з одним патроном)
11. 1500 юнітів (simultaneous simulation /
simultaneous lockstep)
Топологія:
Про синхронність,
Не робіть п2п
12. 1500 юнітів
Синхронізовуєм годинник
(кроки)
Клієнт відправляє подію іншим
клієнтам
Подія виконується на всіх
клієнтах одночасно
(той самий крок, ідентичний порядок)
Кожну ітерацію клієнт посилає
Іншим контрольну суму
Подія-дія юзера, код
детермінований
13. 1500 юнітів
Умови
Однакове виконання коду на всіх клієнтах
Посилаємо лише події згенеровані юзером
Визначаємо максимальний час зворотнього звязку
Синхронізація
Invented by AoE
14. 1500 юнітів
Якщо команда запізнилась:
Визначте комфортну для геймплею затримку
Не привязуйтесь до fps
15. 1500 юнітів
Коли використовуємо:
Ігри з великою кількістю юнітів (RTS)
Нюанси
Запис ігрової сесії (для дебага та геймплейних юніт тестів(?))
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
Продумуйте мультиплеєрну взаємодію до початку розробки
Неможливо переробити
сінгл в мульти