Я всё ещё пилю браузерную стимпанк-MMO и не теряю надежды: как я заселял сервер 5000 ботами
Всем привет! С момента прошлого поста прошло прилично времени. Я не забросил проект, руки не опустил и всё ещё продолжаю пилить-пиить-пилить :).
Сразу дисклеймер: 5000 онлайна — это синтетические боты. Не живые игроки. Но это честные боты, которые подключаются по реальным WebSocket-сокетам, перемещаются по геодате 25 зон острова, собирают лут, применяют скиллы, пишут в чат и нагружают Spatial Grid сервера точно так же, как живые люди.
Городская площадь Деревни поющей стали: толпа ботов у фонтана и NPC, живой чат и стабильные 50 FPS при 5001 онлайне
1. С чего всё началось:
Cамый главный вопрос - сколько людей сервер потянет до того, как сгорит процессор). На 100–300 игроках всё летает. На 1000 - начинаются первые проблемы. Но хотелось проверить планку в 3000-5000 одновременных подключений (CCU) на скромном сервере (2 vCPU, 2 ГБ RAM на базе Яндекс Облака).
Я попросил ИИ написать генератор нагрузки на Node.js и запустил его со своего домашнего компьютера прямо в боевой сервер.
План был простой: заспавнить 3000 сокетов батчами по 20 штук и посмотреть на тик ядра.
Где-то на отметке в 2200–2400 ботов дома внезапно наглухо лёг интернет. Браузер перестал открывать страницы, а в консоли посыпались тайм-ауты сокетов.
Сначала я подумал, что лёг VPS. Захожу с мобильного интернета - сервер живой, тик 0.5 мс, всё спокойно. А домашний роутер просто завис.
Причина оказалась банальной: Обычные домашние роутеры и Wi-Fi-коробочки от провайдеров не рассчитаны на то, что с одной машины в квартире откроется 3000 одновременных TCP/WebSocket соединений. На роутере кончилась таблица NAT-трансляций (SNAT порты), память забилась, и он просто ушел в глубокий нокдаун.
Стало ясно: стресс-тестировать тысячи сокетов с домашнего ПК больше нельзя.
2. Переезд на распределенный кластер GitHub Actions
Чтобы не вешать домашнюю сеть и не арендовать отдельную пачку серверов только ради тестов, пришла идея: использовать раннеры GitHub Actions Matrix.
Восточный полигон: боты распределены по полям, на счетчике 5001 онлайн, рендер 7.6 мс, сеть 0.8 мс
Но тут возникла вторая засада. Если запустить один раннер Ubuntu в GitHub Actions на 5000 сокетов, он упирается в лимит Azure NAT Gateway - для одной виртуальной машины выделяется всего около 2048 эфемерных портов на внешний IP. Всё, что выше, начинает отваливаться с ETIMEDOUT и ECONNRESET.
Решение - матричный запуск:
Раннер #1 (Runner 1): 1700 ботов (смещение ID от 0 до 1699, часть ботов в городе, часть в полях);
Раннер #2 (Runner 2): 1700 ботов (смещение ID от 1700 до 3399);
Раннер #3 (Runner 3): 1600 ботов (смещение ID от 3400 до 4999);
Четвертый агрегатор: собирает метрики, перцентили RTT и формирует итоговый отчет.
Каждый раннер запускается на изолированной виртуальной машине со своим независимым публичным IP-адресом. Проблема с исчерпанием портов исчезла.
3. «Запустил... и нагрузил ровно 49 ботов»
Казалось бы, всё готово. Жму кнопку запуска в GitHub Actions, захожу в игру и вижу: Онлайн: 49.
Запрашивали 5000, а зашло 49. В консолях раннеров - сотни ошибок: Connect error: Unexpected server response: 429
Полез в логи разбираться:
Раннер 1 подключил ровно 16 ботов.
Раннер 2 подключил ровно 16 ботов.
Раннер 3 подключил ровно 16 ботов.
$16 \times 3 = 48$ ботов + я в клиенте = ровно 49.
Оказалось, сработала защита от DoS-атак! В сетевом транспорте стоял лимит: не более 16 активных сокетов с одного внешнего IP-адреса. Для реальных игроков это имело смысл (хотя даже для CGNAT мобильных операторов 16 маловато), но для нагрузочных раннеров это стало железобетонной стеной. Сервер честно отвечал: HTTP 429 Too Many Requests.
Мы с ИИ добавили авторизованный заголовок x-stress-key, подняли базовый порог для игроков до 64, передеплоили ядро на VPS и перезапустили тест.
4. Итог: 5001 онлайн в реальном времени
После фикса все три раннера залетели на сервер на полной скорости.
Холмы Астарда: боты фармят автоматонов и бешеных кофемашин
Вот реальные цифры из консоли и игрового оверлея:
Запрошено ботов: 5000
Успешно подключено: 5000 из 5000 (100%)
Ошибок рукопожатия: 0
Онлайн в игре: 5001 CCU (5000 ботов + 1 GM персонаж)
FPS клиента в браузере: 50–59 FPS (WebGL Three.js)
Время тика игрового сервера: 1.0 мс (EMA: 0.3 мс при норме тика в 100 мс / 10 Hz)
Event Loop Lag Node.js: 11.88 мс (полное отсутствие блокировок главного потока)
Обработано входящих пакетов: свыше 4.7 млн пакетов за тестовую сессию
Трафик: благодаря дельта-сжатию AOI сервер отфильтровал 61.5% лишних обновлений координат
Что позволило серверу не умереть под 5000 сокетами:
uWebSockets.js (C++ Zero-GC транспорт): забыли про стандартный ws из npm для 5000 сокетов на 2GB RAM. Нативный C++ транспорт держит соединения без давления на сборщик мусора V8.
C++ SIMD (AVX2) для расчёта дистанций и коллизий: модуль project_steam_native.node считает AOI и радиусы агро мобов векторными инструкциями процессора за микросекунды.
Worker Threads для сохранения в базу: вся работа с диском и состоянием игроков вынесена на отдельный поток vCPU, поэтому запись профилей никак не задерживает тик игры.
Проект жив, пилится дальше. Впереди ещё огромная гора работы.
Спасибо всем, кто следит и поддерживает! На бумаге все выглядит шикарно, как будет в реальной жизни? Время покажет))
Делаем браузерную MMO про российскую реальность. Показываю, что получилось
Всем привет.
Уже довольно давно делаем свой небольшой игровой проект — РУМИРФ. Решил наконец показать его здесь.
По жанру это браузерная MMO RPG, а по атмосфере — сатирический городок, собранный из очень знакомой российской реальности.
Подъезды, дворы, школы, магазины, кинотеатры, странные местные персонажи, районные разборки, кланы и куча ситуаций, которые иногда выглядят так, будто их придумали для игры, хотя что-то подобное каждый видел в жизни.
Визуально мы сознательно пошли в сторону простой мультяшной стилистики. Хотелось, чтобы персонажи выглядели немного нелепо, окружение было узнаваемым, а сам мир не воспринимался слишком серьёзно.
Сейчас в игре уже можно встретить других игроков прямо на локациях, общаться в чате, выполнять задания, драться с NPC и игроками, прокачивать персонажа, собирать вещи и оружие, вступать в кланы и участвовать в разных игровых событиях.
Но для меня самое интересное — не отдельные механики, а ощущение, что постепенно появляется маленький живой город.
Зашёл на одну локацию — кто-то спорит в чате.
На другой два человека выясняют отношения.
Где-то игрок проходит квест.
И в какой-то момент понимаешь, что игроки начинают придумывать внутри игры свои собственные истории, которых разработчик вообще не планировал.
Откуда появилась идея
Если кто-то застал старые браузерные игры вроде Русского Парка или сокращённо рупарк, то примерно поймёт направление.
Мне всегда нравилась сама концепция такого проекта: не огромный фэнтезийный континент со спасением мира, а небольшой знакомый город, где ценность создают в первую очередь сами игроки.
Мы решили попробовать развить эту идею по-своему и сделать современную браузерную игру, которая запускается без установки отдельного клиента.
При этом задача оказалась намного сложнее, чем кажется со стороны.
Когда одновременно существуют игроки, NPC, бои, предметы, одежда, чат, кланы, задания и разные локации, начинаются совершенно неожиданные проблемы.
Например, сегодня ты несколько часов пытаешься понять, почему у персонажа после второго боя внезапно исчезают штаны.
Завтра выясняешь, почему десять человек одновременно написали сообщения на форуме — и сервер решил, что пришло его время страдать.
А потом ещё пару часов ловишь ситуацию, когда один игрок уже видит начало боя, а второй всё ещё стоит в лобби.
Разработка MMO оказалась довольно хорошим способом постоянно находить новые способы сломать собственную игру :)
Что хочется получить в итоге
Не очередную игру, которую человек открыл на пять минут и забыл.
Хочется постепенно построить место, куда люди смогут периодически возвращаться: посмотреть, что изменилось, встретить знакомых игроков, пройти новый квест, поучаствовать в событии или просто зависнуть вечером в чате.
Поэтому кроме самого мира делаем форум, рейтинги, кланы, достижения, турниры и небольшие временные активности.
И постепенно расширяем сам город.
На скриншоте, например, одна из последних локаций — кинотеатр.
Мне интересно посмотреть на проект глазами людей, которые видят его впервые.
Как вам сама идея такой браузерной MMO в российском сеттинге?
Что вам кажется интереснее всего в подобных играх: развитие персонажа, PvP, кланы, экономика, коллекционирование вещей или именно социальная часть?
И отдельно интересно — есть ли здесь люди, которые когда-то играли в Русский Парк или похожие браузерные проекты?
Aion 2 взлетела в Steam: почти 400 000 одновременных игроков
Это при «смешанных» отзывах, критике ИИ-халтуры и pay-to-win.
Новая MMO Aion 2, продолжение Aion: The Tower of Eternity, собрала около 400 000 одновременных игроков в Steam в первый официальный день — 397 905, по данным SteamDB. Проект от NC занял четвертое место в чарте самых популярных игр Steam, обойдя Apex Legends и Wardogs, а также стал третьей самой скачиваемой игрой на платформе Valve.
При этом отзывы игроков остаются «смешанными». Главные претензии — pay-to-win и «чрезвычайно хищная монетизация»; некоторые называют игру «полной противоположностью хорошей MMO». Звучит и критика в духе «ИИ-халтуры»: на странице указано, что часть внутриигровых ассетов, включая дизайн карт арканов и некоторые иконки, создана с помощью ИИ-инструментов.
Есть и позитив: хвалят редактор персонажа, визуал и населенность мира. Так что Aion 2 уже получила активное сообщество — несмотря на споры вокруг монетизации и использования генеративного ИИ.
Переходите на ggsel.net — торговую площадку, где вы найдете игры для ПК и консолей, DLC, сможете пополнить баланс популярных игровых и неигровых сервисов, купить и продать игровой аккаунт. И все это — по низким ценам!
Enshrouded выходит в 1.0: как поднять свой сервер и не держать компьютер включённым ночами
Способ 1. Хост из игры
Создаёте мир, ставите пароль, друзья находят сессию через «Присоединиться». До 16 игроков, бесплатно, ничего настраивать не нужно.
Минус один, но большой: мир работает, пока хост в игре. Хост ушёл спать — все вышли. Вдобавок его ПК тянет и игру, и сервер одновременно.
Способ 2. Свой выделенный сервер
Ставите Enshrouded Dedicated Server: в Steam через «Инструменты» или через SteamCMD (app ID 2278520). Сервер есть только под Windows, на Linux его запускают через Wine или Proton.
Запускаете enshrouded_server.exe напрямую. Разработчики советуют не запускать его кнопкой в Steam.
После первого запуска рядом появится enshrouded_server.json. Главное в нём: name (имя сервера), slotCount (от 1 до 16), gameSettingsPreset (Default, Relaxed, Hard, Survival или Custom), saveDirectory.
Пароли теперь задаются не одним полем. В блоке userGroups у каждой группы (Admin, Friend, Guest, Visitor) свой пароль и права: кто может строить, открывать сундуки, кикать.
Пробрасываете порты. Официально нужен queryPort 15637; большинство гайдов открывают 15636–15637 UDP. Сервер работает только по IPv4.
Друзья подключаются через «Присоединиться» с включённым фильтром выделенных серверов или добавляют IP:15637 в Steam → «Вид» → «Игровые серверы» → «Избранное».
Железо по рекомендации Keen Games: на 4–6 игроков — 6-ядерный процессор 3,2 ГГц, 16 ГБ оперативной памяти, SSD с 30 ГБ свободного места и 2 Мбит/с исходящего канала на каждого игрока. На 16 игроков — уже 8 ядер.
Где обычно всё ломается:
Серый IP. Если провайдер выдаёт адрес за CGNAT, проброс портов не поможет, и друзья не подключатся.
Версии. Сервер нужно обновлять вместе с игрой. В день релиза 1.0 версии разойдутся почти наверняка.
Аптайм. Компьютер с сервером должен работать круглосуточно, иначе вы вернулись к способу 1.
Как перенести мир из раннего доступа
Локальные сохранения лежат в %USERPROFILE%\Saved Games\enshrouded, со Steam Cloud — в Steam\userdata\<ваш ID>\1203620\remote. У файлов мира фиксированные имена: мир 1 — 3ad85aea, мир 2 — 3bd85c7d, плюс файлы -index и _info. Их копируют в папку savegame сервера. Перед обновлением до 1.0 сделайте бэкап.
Способ 3. Арендовать готовый сервер на Сервариум
Сервер Enshrouded запускается за 1–5 минут после оплаты. Выбираете число игроков, получаете адрес и кидаете друзьям. Порты, json и обновления — их забота.
Мир живёт 24/7: друзья заходят, когда удобно, даже если вы офлайн.
Свой мир из раннего доступа можно загрузить через личный кабинет.
Сервер в России, с защитой от DDoS.
Низкий пинг от 10 мс.
Поддержка в Telegram и ВК отвечает за 5–7 минут. В день релиза, когда всё обновляется, это чувствуется.
На неделю — от 690 ₽. С июля серверы у Сервариума оплатили больше 2 800 человек.
Что выбрать
Играете вдвоём и всегда вместе — хватит хоста из игры.
Есть белый IP, мощный ПК, много нервов и желание копаться в конфигах — поднимайте свой сервер.
Нужен мир, который живёт без вас, и нет желания тратить силы на настройку — арендуйте.
Первый сервер можно взять на пробу — 99 ₽ за 5 дней, чтобы проверить пинг до релиза. На месяц — с промокодом PIKABU скидка 15%. Сервер Enshrouded на Сервариуме
Промокод в текстовой ммо ToR!
📜Промокод "Дженга"
• Активировать можно с момента выхода поста и до 11.10, 23:59:00
• Действует 1 час. Работает только на мобов.
• +20% к получаемому опыту
• +20% к макс ядрам с мобов.
📖Промокод вводится прямо в чат с ботом.
#tor #towerofrandom
Dungeons & Dragons: World of Warcraft перенесёт Азерот в настольные приключения
Dungeons & Dragons: World of Warcraft — настольная адаптация MMO World of Warcraft для правил D&D. Игроки отправятся в приключения по Азероту, а книга охватит мир игры и дополнения вплоть до Midnight. Вместо повторения MMO-шного фарма авторы переносят её атмосферу и знаковые эпизоды в формат настольной ролевой игры.
В книге появятся знакомые подземелья, в том числе Мёртвые копи и Dire Maul: маршруты позволят обходить некоторых боссов или скрытно пробираться мимо них. Предусмотрены встречи с известными персонажами — среди них Король-лич, Иллидан и Джайна Праудмур, — а также сбор ресурсов, ремёсла и система репутации у фракций, открывающая награды. Выход книги запланирован на 12 ноября.
Подробнее — в источнике, но там на eng.











