Максим Гринів “Правильна розробка мультиплеєру”
TRANSCRIPT
![Page 1: Максим Гринів “Правильна розробка мультиплеєру”](https://reader033.vdocuments.mx/reader033/viewer/2022042522/55a89b561a28aba37f8b4698/html5/thumbnails/1.jpg)
Від 2х до 1500 кросплатформених
мультиплеєрних юнітів на карті
Як правильно синхронізувати мультиплеєрні ігри
Чому мультплеєр, завжди біг тинг, все з практики,
динамічні ігри, шана АоЕ
![Page 2: Максим Гринів “Правильна розробка мультиплеєру”](https://reader033.vdocuments.mx/reader033/viewer/2022042522/55a89b561a28aba37f8b4698/html5/thumbnails/2.jpg)
Авторитарний сервер
Топологія
В 2х словах, Не робіть п2п
![Page 3: Максим Гринів “Правильна розробка мультиплеєру”](https://reader033.vdocuments.mx/reader033/viewer/2022042522/55a89b561a28aba37f8b4698/html5/thumbnails/3.jpg)
Авторитарний сервер
Синхронізація
Подія з клієнта відправляється на сервер
Сервер підтверджує подію і відправляє результат всім клієнтам
Сервер генерує події та відправляє клієнтам
![Page 4: Максим Гринів “Правильна розробка мультиплеєру”](https://reader033.vdocuments.mx/reader033/viewer/2022042522/55a89b561a28aba37f8b4698/html5/thumbnails/4.jpg)
Авторитарний сервер
Коли використовуємо:
Покрокові ігриОперації з внутрішньо-ігровими предметами, валютоюЛокальний мультиплеєр
Нюанси
Затримка дій юзера
Нагрузка на сервер
Розробка серверної частини гри
Лишній трафік
Чому взагалі за це згадав, не робіть так, фізика
Коли не використовуємо:Будь-яка динамікаВелика кількість юнітівВеликий пінг
![Page 5: Максим Гринів “Правильна розробка мультиплеєру”](https://reader033.vdocuments.mx/reader033/viewer/2022042522/55a89b561a28aba37f8b4698/html5/thumbnails/5.jpg)
Незалежна симуляція
Топологія:
Не робіть п2п
![Page 6: Максим Гринів “Правильна розробка мультиплеєру”](https://reader033.vdocuments.mx/reader033/viewer/2022042522/55a89b561a28aba37f8b4698/html5/thumbnails/6.jpg)
Незалежна симуляція
Синхронізація:
Подія моментально виконується на
клієнті та відсилається іншим клієнтам
Клієнти регулярно посилають частину
свого стану для синхронізації
Клієнти можуть перераховують симуляцію
якщо приходять повідомлення «з
минулого»
![Page 7: Максим Гринів “Правильна розробка мультиплеєру”](https://reader033.vdocuments.mx/reader033/viewer/2022042522/55a89b561a28aba37f8b4698/html5/thumbnails/7.jpg)
Незалежна симуляція
Пересчет симуляции
![Page 8: Максим Гринів “Правильна розробка мультиплеєру”](https://reader033.vdocuments.mx/reader033/viewer/2022042522/55a89b561a28aba37f8b4698/html5/thumbnails/8.jpg)
Незалежна симуляція
Фізика при незалежній симуляції
![Page 9: Максим Гринів “Правильна розробка мультиплеєру”](https://reader033.vdocuments.mx/reader033/viewer/2022042522/55a89b561a28aba37f8b4698/html5/thumbnails/9.jpg)
Незалежна симуляція
Колізії:
Використовуємо психологію
![Page 10: Максим Гринів “Правильна розробка мультиплеєру”](https://reader033.vdocuments.mx/reader033/viewer/2022042522/55a89b561a28aba37f8b4698/html5/thumbnails/10.jpg)
Незалежна симуляція
Коли використовуємо:
Динамічні ігри з швидким зворотнім звязком
(шутери, слешери, платформери, гонки ітд)
Нюанси
Можна використовувати non reliable повідомлення
Фізика: колізії тільки зі статичними тілами
При розробці завжди памятаємо за синхронізацію
Security
Кросплатформеність без проблем
Коли не використовуємо:
Велика кількість юнітів
Ідеальна синхронізація (шутер з одним патроном)
![Page 11: Максим Гринів “Правильна розробка мультиплеєру”](https://reader033.vdocuments.mx/reader033/viewer/2022042522/55a89b561a28aba37f8b4698/html5/thumbnails/11.jpg)
1500 юнітів (simultaneous simulation /
simultaneous lockstep)Топологія:
Про синхронність, Не робіть п2п
![Page 12: Максим Гринів “Правильна розробка мультиплеєру”](https://reader033.vdocuments.mx/reader033/viewer/2022042522/55a89b561a28aba37f8b4698/html5/thumbnails/12.jpg)
1500 юнітів
Синхронізовуєм годинник (кроки)
Клієнт відправляє подію іншим клієнтам
Подія виконується на всіхклієнтах одночасно (той самий крок, ідентичний порядок)
Кожну ітерацію клієнт посилає Іншим контрольну суму
Подія-дія юзера, код детермінований
![Page 13: Максим Гринів “Правильна розробка мультиплеєру”](https://reader033.vdocuments.mx/reader033/viewer/2022042522/55a89b561a28aba37f8b4698/html5/thumbnails/13.jpg)
1500 юнітів
Умови
Однакове виконання коду на всіх клієнтах
Посилаємо лише події згенеровані юзером
Визначаємо максимальний час зворотнього звязку
Синхронізація
Invented by AoE
![Page 14: Максим Гринів “Правильна розробка мультиплеєру”](https://reader033.vdocuments.mx/reader033/viewer/2022042522/55a89b561a28aba37f8b4698/html5/thumbnails/14.jpg)
1500 юнітів
Якщо команда запізнилась:
Визначте комфортну для геймплею затримку
Не привязуйтесь до fps
![Page 15: Максим Гринів “Правильна розробка мультиплеєру”](https://reader033.vdocuments.mx/reader033/viewer/2022042522/55a89b561a28aba37f8b4698/html5/thumbnails/15.jpg)
1500 юнітів
Коли використовуємо:
Ігри з великою кількістю юнітів (RTS)
Нюанси
Запис ігрової сесії (для дебага та геймплейних юніт тестів(?))
Checksum error хрен віддебагаєш
В розробці мало відрізняється від сінглплеєру (якщо слідувати
правилам)
Правила (Не використовуємо події анімації, синхронізуємо
Random)
Дуже низький трафік
Не хакається - checksum error
Коли не використовуємо:
Ігри зі швидким зворотнім звязком (в умовах високого пінгу)
![Page 16: Максим Гринів “Правильна розробка мультиплеєру”](https://reader033.vdocuments.mx/reader033/viewer/2022042522/55a89b561a28aba37f8b4698/html5/thumbnails/16.jpg)
Boid Multiplayer
![Page 17: Максим Гринів “Правильна розробка мультиплеєру”](https://reader033.vdocuments.mx/reader033/viewer/2022042522/55a89b561a28aba37f8b4698/html5/thumbnails/17.jpg)
1500 юнітів
![Page 18: Максим Гринів “Правильна розробка мультиплеєру”](https://reader033.vdocuments.mx/reader033/viewer/2022042522/55a89b561a28aba37f8b4698/html5/thumbnails/18.jpg)
Додаємо мультиплатформу
Floating point indeterminism
27.241412814841299999
vs.
27.241412814841200001
Intel 80 bit, different architectures, os etc, can be
fixed with compiler
![Page 19: Максим Гринів “Правильна розробка мультиплеєру”](https://reader033.vdocuments.mx/reader033/viewer/2022042522/55a89b561a28aba37f8b4698/html5/thumbnails/19.jpg)
Додаємо мультиплатформу
Fixed point math
Використовуйте кросплатформену технологію
Замість float свій тип даних
Низька точність
Низька швидкодія деяких операцій
Неможливо використовувати чужі бібліотеки (пишемо свій Box2D,
path finding, ray casting, структури даних) Sin-lookup table, sqrt – for, числові ряди
![Page 20: Максим Гринів “Правильна розробка мультиплеєру”](https://reader033.vdocuments.mx/reader033/viewer/2022042522/55a89b561a28aba37f8b4698/html5/thumbnails/20.jpg)
Поради
Використовуйте reliable UDP
Cloud
Не використовуйте P2P
Використовуйте protocol buffers
Продумуйте мультиплеєрну взаємодію до початку розробки
Неможливо переробити сінгл в мульти
![Page 21: Максим Гринів “Правильна розробка мультиплеєру”](https://reader033.vdocuments.mx/reader033/viewer/2022042522/55a89b561a28aba37f8b4698/html5/thumbnails/21.jpg)
Питання
?