Upload
lviv-startup-club
View
142
Download
1
Embed Size (px)
Citation preview
Від 2х до 1500 кросплатформених
мультиплеєрних юнітів на карті
Як правильно синхронізувати мультиплеєрні ігри
Чому мультплеєр, завжди біг тинг, все з практики,
динамічні ігри, шана АоЕ
Авторитарний сервер
Топологія
В 2х словах, Не робіть п2п
Авторитарний сервер
Синхронізація
Подія з клієнта відправляється на сервер
Сервер підтверджує подію і відправляє результат всім клієнтам
Сервер генерує події та відправляє клієнтам
Авторитарний сервер
Коли використовуємо:
Покрокові ігриОперації з внутрішньо-ігровими предметами, валютоюЛокальний мультиплеєр
Нюанси
Затримка дій юзера
Нагрузка на сервер
Розробка серверної частини гри
Лишній трафік
Чому взагалі за це згадав, не робіть так, фізика
Коли не використовуємо:Будь-яка динамікаВелика кількість юнітівВеликий пінг
Незалежна симуляція
Топологія:
Не робіть п2п
Незалежна симуляція
Синхронізація:
Подія моментально виконується на
клієнті та відсилається іншим клієнтам
Клієнти регулярно посилають частину
свого стану для синхронізації
Клієнти можуть перераховують симуляцію
якщо приходять повідомлення «з
минулого»
Незалежна симуляція
Пересчет симуляции
Незалежна симуляція
Фізика при незалежній симуляції
Незалежна симуляція
Колізії:
Використовуємо психологію
Незалежна симуляція
Коли використовуємо:
Динамічні ігри з швидким зворотнім звязком
(шутери, слешери, платформери, гонки ітд)
Нюанси
Можна використовувати non reliable повідомлення
Фізика: колізії тільки зі статичними тілами
При розробці завжди памятаємо за синхронізацію
Security
Кросплатформеність без проблем
Коли не використовуємо:
Велика кількість юнітів
Ідеальна синхронізація (шутер з одним патроном)
1500 юнітів (simultaneous simulation /
simultaneous lockstep)Топологія:
Про синхронність, Не робіть п2п
1500 юнітів
Синхронізовуєм годинник (кроки)
Клієнт відправляє подію іншим клієнтам
Подія виконується на всіхклієнтах одночасно (той самий крок, ідентичний порядок)
Кожну ітерацію клієнт посилає Іншим контрольну суму
Подія-дія юзера, код детермінований
1500 юнітів
Умови
Однакове виконання коду на всіх клієнтах
Посилаємо лише події згенеровані юзером
Визначаємо максимальний час зворотнього звязку
Синхронізація
Invented by AoE
1500 юнітів
Якщо команда запізнилась:
Визначте комфортну для геймплею затримку
Не привязуйтесь до fps
1500 юнітів
Коли використовуємо:
Ігри з великою кількістю юнітів (RTS)
Нюанси
Запис ігрової сесії (для дебага та геймплейних юніт тестів(?))
Checksum error хрен віддебагаєш
В розробці мало відрізняється від сінглплеєру (якщо слідувати
правилам)
Правила (Не використовуємо події анімації, синхронізуємо
Random)
Дуже низький трафік
Не хакається - checksum error
Коли не використовуємо:
Ігри зі швидким зворотнім звязком (в умовах високого пінгу)
Boid Multiplayer
1500 юнітів
Додаємо мультиплатформу
Floating point indeterminism
27.241412814841299999
vs.
27.241412814841200001
Intel 80 bit, different architectures, os etc, can be
fixed with compiler
Додаємо мультиплатформу
Fixed point math
Використовуйте кросплатформену технологію
Замість float свій тип даних
Низька точність
Низька швидкодія деяких операцій
Неможливо використовувати чужі бібліотеки (пишемо свій Box2D,
path finding, ray casting, структури даних) Sin-lookup table, sqrt – for, числові ряди
Поради
Використовуйте reliable UDP
Cloud
Не використовуйте P2P
Використовуйте protocol buffers
Продумуйте мультиплеєрну взаємодію до початку розробки
Неможливо переробити сінгл в мульти
Питання
?