Как я искал, на каком «языке» моя MMO будет говорить с игроками, ч. 3
Когда начинаешь делать свою онлайн-игру в одиночку, первое, что понимаешь: спросить некого. Я искал на русском, как устроены игровые серверы, — и находил в лучшем случае пару разрозненных статей. Друзей, которые когда-то мечтали со мной о своей игре, рядом уже не было: у всех работа и семьи. Так что разбираться пришлось самому.
Первый же вопрос оказался фундаментальным: как игра вообще будет общаться с сервером?
Разговор, который не прерывается
Обычный сайт работает как письмо: браузер спросил — сервер ответил — разговор закончен. Для игры так нельзя. Монстр подошёл к вам, соседний игрок ударил — сервер должен сам сообщить об этом, не дожидаясь вопроса.
Поэтому я выбрал WebSocket: соединение открывается один раз и держится всё время, пока вы в игре. Сервер и игра могут писать друг другу в любой момент.
У такого способа есть цена. Каждое сообщение доставляется гарантированно и по порядку, а значит, на проверку доставки уходит время. Есть и другой способ, без гарантий, — им пользуются, например, быстрые шутеры, где потеря пары пакетов не страшна. Для RPG, где важно, дошла ли команда «выпить зелье», я выбрал надёжность.
Выдержит ли
Дальше был страх, знакомый каждому, кто пишет сервер на «несерьёзном» языке: а вдруг не потянет? Я нашёл большой публичный рейтинг скорости веб-серверов и посмотрел, где там решение на PHP, которое я собирался взять.
Оно оказалось в самой верхушке: около 350 тысяч запросов в секунду. Помню это облегчение — значит, дорога не тупиковая, можно идти дальше.
Правда, сразу возник следующий вопрос: а сколько игроков на самом деле выдержит такой сервер? Ответ оказался не таким простым, и о нём — в следующей части.
А вы с чего начинали, когда брались за что-то большое в одиночку? Было ли у вас это чувство «спросить некого»?
История:
- Введение
- Масштабируемость и асинхронность
- WebSocket
- Redis
- LUA и JavaScript
- Выбор технологий, протокола и архитектурный шаблон Entity Component System
- Игровые локации (тайловые карты)
- Клиентская часть на Unity
- Игровые серверные механики
- Открытый бесшовный мир в 2D игре
- FPS, Ping, паузы между командами, интерполяция и экстраполяция
- Очереди и параллельное программирование на CPU
- Event-driven паттерн, JSON-RPC и почему не сервисная (SOA) архитектура
- Сетевая карта и задержка кадра (Latency frame) по RFC 2544 (1242)
- Создание сервера для онлайн ММО игр на PHP
- Готовое MVP сервиса 2D MMO RPG игр (realtime)
- Я научил ИИ делать мою MMO: игровая фича теперь рождается из одного описания
- Конвейер контента для MMO: импорт анимации, экипировка и обновление игры без патчей
- Каталог ассетов и git: как командой вести игру в облаке
- Как я тестирую код, который пишет ИИ: контракты вместо тестов
- Бесшовный мир: как карты MMO сшиваются в одно целое
- Сколько обходится содержание одного игрока