Пустой мир ничего не стоит. Я поднимаю два десятка карт, прохожу их из конца в конец — и сервер этого почти не замечает: карта без людей и существ держит своё место в памяти и дремлет. Стоить мир начинает в тот момент, когда в нём кто-то живёт.

В прошлой части мир Тулимшара сшили в бесшовный, и я обещал его заселить. Заселение в этот раз я показал не текстом, а на экране — серией уроков, ссылки ниже. А главный вопрос этой части — во что живой мир обходится серверу и сколько из этого приходится на одного игрока.

Коротко о проекте

С 2022 года я в одиночку веду дневник разработки: делаю авторитарный сервер для 2D MMO RPG — игр с открытым бесшовным миром, где игроки и существа живут в реальном времени. Сервер на PHP и Symfony, клиент на Unity, правду о мире считает только сервер. С 17-й части в работе участвует ИИ: механику он собирает по словесному описанию, а что в ней считать верным, решаю я. Показываю всё на The Mana World — открытой MMO, которую я переношу на платформу.

Последние части складываются в одну линию: у платформы появились инструменты совместной работы — соавторы с доступом к нужным разделам, каталог, из которого игра набирается готовыми кусками: мирами, анимациями, наборами картинок, библиотеками механик. Она устроена так, чтобы свою игру на ней собирал не только я; каталог подробно разобран в 19-й части. Эта часть — про то, что происходит с миром после того, как его собрали.

Заселение — на экране

Как устроено существо — шаблон с обликом и свойствами, особи на картах — я рассказывал в 18-й части. Повторять не буду: в этот раз я снял серию коротких уроков, где всё это происходит на экране: добавить мир из каталога, сшить карты в открытый, поставить на карту врагов, задать баланс, посмотреть нагрузку на сервер, открыть доступ второму человеку. Каждый выпуск — от полутора до четырёх минут и ровно один результат.

Все выпуски — в плейлисте «? Панель управления: игра без кода».

Заселение карты — от пустого раздела до мобов, которые по ней ходят:

Ролики снимает сама платформа: сцена описывается тем, что в ней происходит — какую страницу открыть, куда пройти персонажу, что нажать, — а дальше кадры, озвучка и сборка идут конвейером. Правила подачи — что считать результатом выпуска и как строится плейлист — задал я, а план выпуска и съёмку по ним ведёт ИИ.

Ролики канала — записи платформы: номер выпуска, разделы, о которых он, число сцен, даты сборки и выкладки. Состояние подсказывает, что с роликом делать дальше
Ролики канала — записи платформы: номер выпуска, разделы, о которых он, число сцен, даты сборки и выкладки. Состояние подсказывает, что с роликом делать дальше
Страница одного выпуска: карточка на YouTube с обложкой, голос и звучание озвучки, собранное видео с описанием, разделы, о которых ролик, и его сцены

Дальше из этих выпусков вырастает курс: сквозной путь от пустой игры до мира, по которому ходят игроки. У курса будет готовый шаблон игры — тот самый, который получается по ходу уроков, — так что его можно не собирать за мной, а забрать и потрогать.

Во что обходится живой мир

Теперь то, ради чего всё это считалось. Во что обойдётся мир, видно ещё до того, как игру кто-то установил, — прямо на её карточке в каталоге. Уроки снимаются на отдельной учебной игре, а считаю я на большом мире — The Mana World:

Карточка игры в каталоге: слева открыта команда «выстрел заклинанием» с ценой срабатывания формулами, справа блок «Во что обойдётся сервер» — онлайн и плотность существ выбираются списками, память, ядра и карты пересчитываются сразу

Читается блок без всякой математики. Карта работает, только пока на ней кто-то есть: пришёл игрок — сервер её поднимает. На снимке выбрано три сотни игроков — «спокойная улица» — и нормальная плотность существ: поднимется 21 карта из 26, уйдёт около гигабайта памяти и три с небольшим ядра. Живых — тех, кого сервер обсчитывает каждый такт, — 743: сами игроки и разбуженные рядом с ними существа. Сменил онлайн или плотность — числа пересчитались сразу.

Отсюда и ответ на вопрос из заголовка. Делим итог на число игроков — выходит около 3 МБ памяти и сотая доля ядра на одного, вместе с существами, которых он будит вокруг себя. Цифра не постоянная: при другом онлайне и другой плотности существ она другая, расход растёт не по прямой — потому калькулятор и считает по ступеням, а не одной ставкой.

Откуда берутся эти числа — вот это и есть главное. Страница складывает их из того, что уже лежит в игре:

  • сколько людей пришло. Онлайн задаётся не числом, а плотностью — сколько игроков приходится на проходимую площадь мира, от «как в MMO в среднем» до «людной площади»;

  • насколько мир заселён. Вторая ось — сколько существ приходится на площадь, от почти пустой местности до постоянных столкновений;

  • какие карты и кто на них стоит. Площадь каждой карты, с кем она соседствует, каких существ на ней расставили — по их видам считается цена механик. Поднятый сосед добавляет работы: изменения уходят и ему;

  • кто спит, а кто живёт. Спящее существо стоит только памяти. Проснулось оно, когда рядом прошёл игрок, — и уже работает каждый такт. Сколько стоит эта работа, зависит от вида: карта с дюжиной хищников обходится дороже карты такой же площади с сундуками;

  • сколько стоит сама механика. У каждой команды игры цена записана формулой — как дорожает срабатывание от обстановки: поиск целей вокруг существа в толпе стоит больше, чем на пустой поляне. Её видно на карточке команды в том же каталоге. Формулу ставит тот, кто ведёт механику; у меня её выводит ИИ, разбирая сложность алгоритма в коде команды. Так же оценён и один такт основы игры — насколько он тяжелеет, когда живых и соседей вокруг каждого становится больше. У механики без оценки платформа берёт своё умолчание и пишет «цена не оценена», а такт без оценки не считается вовсе — карта честно помечается неоценённой.

Постоянные части — сколько стоит поднятая карта сама по себе, её земля и каждое существо в памяти — сняты замерами на живом сервере, часть ставок платформа пока принимает оценкой. Игра подставляет своё: площадь, состав существ, частоту тактов и цену своих механик.

У установленной игры тот же расчёт идёт подробнее — на странице её ресурсов в панели управления, с разбивкой по серверам, на которых крутятся её карты: мир раскладывается по нескольким машинам, и как это устроено, я разбирал в 10-й части.

Оговорюсь честно: это оценка по модели, а не счёт по факту, и часть ставок верна в пределах двух-трёх раз. Сняты они на моих картах, и на чужой игре с другим фреймворком разойдутся. Мне важно было другое — чтобы человек, который собирает мир, видел цену своих решений до того, как их примет, а не после.

Отдельно скажу то, ради чего это затевалось. При обычном для MMO онлайне этот мир занимает пару сотен мегабайт и долю одного ядра — это помещается на небольшую машину, из тех, на которых держат сайты. Придёт больше людей — добавляется ещё узел, и миры расходятся по узлам. Не игровой кластер с первого дня: расход я считал и резал с самого начала.

К прошлой части: у схемы переходов появилась проверка прохода

Карта в редакторе выглядит проходимой. На деле у неё бывают области, между которыми хода нет: кусок земли, отрезанный скалой, или помещение, дверь в которое никуда не ведёт.

Схему переходов между картами я показывал в прошлой части — она про двери и отвечает, куда каждая ведёт. Но дверь, которая ведёт правильно, ещё не значит, что до неё можно дойти. Теперь платформа раскладывает проходимые клетки каждой карты на связные области, связывает их переходами и бесшовными стыками и обходит получившийся граф от клетки, где появляется новый персонаж. Ответ простой: вот сюда игрок дойдёт, а сюда — никогда.

Схема мира и проверка прохода: жёлтая рамка — в карте есть места, куда игроку не попасть, красная — карта отрезана целиком. Справа все 26 таких мест, у порта в одном из них заперто 15 существ

В моём мире таких мест 26, и на схеме их видно сразу — по рамкам карт. Мелочь в одну-две клетки у краёв тут тоже есть, но большинство — куски в десятки и сотни клеток. Две карты отрезаны целиком: канализация и летающий остров. А в отрезанном куске у порта стоят пятнадцать существ.

Самое полезное в этой таблице — последний столбец. Отрезанный кусок земли сам по себе бывает задумкой. Вопрос к нему появляется, когда в нём кто-то стоит: пятнадцать существ, которых игрок никогда не встретит, — это ошибка расстановки, найденная до того, как её нашёл игрок.

И результат обхода получает сама игра. Движок берёт готовые области вместе с данными карты и по ним отбивает поиск пути в недостижимую цель, не перебирая клетки. Один и тот же расчёт отвечает и мне на странице, и механике внутри мира.

Чего ИИ не умеет

Инструменты из этой части писал ИИ, ролики собирает он же. Чего он не делает сам:

  • не решает, каким мир должен быть. Сколько существ на поляне и где игрок обязан испугаться, придумывает человек;

  • не отличает задумку от ошибки. Таблица честно перечисляет все 26 отрезанных мест, а какие из них задуманы, решаю я;

  • не придумывает правила подачи. Что считать результатом выпуска и как строится плейлист, задал я — по этим правилам он планирует и снимает сам.

Что дальше

Мир заселён, и видно, куда в нём не дойти. Дальше — то, что делает мир игрой, а не декорацией: добыча с побеждённых, сундуки, торговля у лавочника. Часть из этого уже стоит в игре, и об этом будет следующая часть.

Графика мира пока та, что пришла из The Mana World. Ремастер тайлов — отдельная работа, до которой я дойду позже.

И ещё одно направление, которое я веду параллельно. По-настоящему хорошие игры, я уверен, сделают те, кто придёт на платформу со своим знанием геймдизайна: моя задача — чтобы у них были для этого инструменты. А чтобы показать инструменты в деле, я переношу на платформу старые MMO RPG с открытым кодом и контентом — на их материале снимаются и уроки. The Mana World — первая из них.

Вопрос к вам

Кто запускал свой игровой сервер: как вы заранее прикидывали, сколько железа уйдёт на мир, — считали, мерили на стенде или узнавали по факту после запуска?

История

  1. Платформа для 2D MMO вместо очередного игрового сервера

  2. Почему одного процесса не хватит: асинхронность и масштаб

  3. Почему игровому серверу нужен WebSocket, а не HTTP

  4. Redis как память игрового мира: сколько игроков и NPC он держит

  5. Lua или JavaScript в песочнице: чей код быстрее на сервере

  6. Выбор технологий и ECS: почему архитектура быстрее языка

  7. Тайловые карты: импорт локаций из Tiled одной строкой

  8. Клиент на Unity для авторитарного сервера: что он обязан уметь

  9. Игровые механики без обновления клиента: события на сервере

  10. Бесшовный мир в 2D MMO: локации на разных машинах

  11. Почему персонаж телепортируется: пинг, интерполяция и экстраполяция

  12. Очереди без RabbitMQ: обмен между процессами в памяти

  13. Event-driven и JSON-RPC: почему игровой сервер не собран из сервисов

  14. Не размер пакета: где на самом деле узкое место сетевого сервера

  15. Почему сервер собран на процессах, а не на потоках

  16. MVP авторитарного сервера для 2D MMO: три года и что получилось

  17. Внедряю ИИ: механики из одного описания

  18. Конвейер контента для MMO: импорт анимации, экипировка и обновление игры без патчей

  19. Каталог ассетов и git для MMO: как командой вести игру в облаке

  20. Тесты для кода, который пишет ИИ: контракты вместо ассертов

  21. ИИ-картограф: как карты сшиваются в бесшовный мир

  22. Сколько обходится содержание одного игрока

Комментарии (5)


  1. Pronkin_Timofey1612
    21.09.2026 18:27

    Содержание одного игрока в 2D MMORPG зависит от серверной архитектуры, используемого движка и объема передаваемых данных (синхронизация позиций, чат, инвентарь).


    1. webrobot Автор
      21.09.2026 18:27

      Так и есть. Я и создал сервер сам, придумал архитектуру. Подумал хорошо бы человек сразу знал сколько железа потребуется если захочет свою 2D mmo сделать. Не находите удобным?


    1. webrobot Автор
      21.09.2026 18:27

      Я у Photon Engine глянул прайс за такое, там х20 наверно они накручивают. И у людей может сложится устойчивое впечатление “mmo rpg сделать тока для богатых”


    1. webrobot Автор
      21.09.2026 18:27

      А так вот щас сделаю…и картой мир оплатить можно…и осуществлю мечту детства ради которой в програмисты пошел. И другим помогу


  1. PlagiatXXX
    21.09.2026 18:27

    Очень интересно! Спасибо!