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

Коротко о проекте
С 2022 года я в одиночку веду дневник разработки: делаю авторитарный сервер для 2D MMO RPG — игр с открытым бесшовным миром, где игроки и существа живут в реальном времени. Сервер на PHP и Symfony, клиент на Unity, правду о мире считает только сервер. С 17-й части в работе участвует ИИ: механику он собирает по словесному описанию, а что в ней считать верным, решаю я. Показываю всё на The Mana World — открытой MMO, которую я переношу на платформу.
Последние части складываются в одну линию: у платформы появились инструменты совместной работы — соавторы с доступом к нужным разделам, каталог, из которого игра набирается готовыми кусками: мирами, анимациями, наборами картинок, библиотеками механик. Она устроена так, чтобы свою игру на ней собирал не только я; каталог подробно разобран в 19-й части. Эта часть — про то, что происходит с миром после того, как его собрали.
Заселение — на экране
Как устроено существо — шаблон с обликом и свойствами, особи на картах — я рассказывал в 18-й части. Повторять не буду: в этот раз я снял серию коротких уроков, где всё это происходит на экране: добавить мир из каталога, сшить карты в открытый, поставить на карту врагов, задать баланс, посмотреть нагрузку на сервер, открыть доступ второму человеку. Каждый выпуск — от полутора до четырёх минут и ровно один результат.
Все выпуски — в плейлисте «🛠 Панель управления: игра без кода».
Заселение карты — от пустого раздела до мобов, которые по ней ходят:
Ролики снимает сама платформа: сцена описывается тем, что в ней происходит — какую страницу открыть, куда пройти персонажу, что нажать, — а дальше кадры, озвучка и сборка идут конвейером. Правила подачи — что считать результатом выпуска и как строится плейлист — задал я, а план выпуска и съёмку по ним ведёт ИИ.
Дальше из этих выпусков вырастает курс: сквозной путь от пустой игры до мира, по которому ходят игроки. У курса будет готовый шаблон игры — тот самый, который получается по ходу уроков, — так что его можно не собирать за мной, а забрать и потрогать.
Во что обходится живой мир
Теперь то, ради чего всё это считалось. Во что обойдётся мир, видно ещё до того, как игру кто-то установил, — прямо на её карточке в каталоге. Уроки снимаются на отдельной учебной игре, а считаю я на большом мире — The Mana World:
Читается блок без всякой математики. Карта работает, только пока на ней кто-то есть: пришёл игрок — сервер её поднимает. На снимке выбрано три сотни игроков — «спокойная улица» — и нормальная плотность существ: поднимется 21 карта из 26, уйдёт около гигабайта памяти и три с небольшим ядра. Живых — тех, кого сервер обсчитывает каждый такт, — 743: сами игроки и разбуженные рядом с ними существа. Сменил онлайн или плотность — числа пересчитались сразу.
Отсюда и ответ на вопрос из заголовка. Делим итог на число игроков — выходит около 3 МБ памяти и сотая доля ядра на одного, вместе с существами, которых он будит вокруг себя. Цифра не постоянная: при другом онлайне и другой плотности существ она другая, расход растёт не по прямой — потому калькулятор и считает по ступеням, а не одной ставкой.
Откуда берутся эти числа — вот это и есть главное. Страница складывает их из того, что уже лежит в игре:
-
сколько людей пришло. Онлайн задаётся не числом, а плотностью — сколько игроков приходится на проходимую площадь мира, от «как в MMO в среднем» до «людной площади»;
-
насколько мир заселён. Вторая ось — сколько существ приходится на площадь, от почти пустой местности до постоянных столкновений;
-
какие карты и кто на них стоит. Площадь каждой карты, с кем она соседствует, каких существ на ней расставили — по их видам считается цена механик. Поднятый сосед добавляет работы: изменения уходят и ему;
-
кто спит, а кто живёт. Спящее существо стоит только памяти. Проснулось оно, когда рядом прошёл игрок, — и уже работает каждый такт. Сколько стоит эта работа, зависит от вида: карта с дюжиной хищников обходится дороже карты такой же площади с сундуками;
-
сколько стоит сама механика. У каждой команды игры цена записана формулой — как дорожает срабатывание от обстановки: поиск целей вокруг существа в толпе стоит больше, чем на пустой поляне. Её видно на карточке команды в том же каталоге. Формулу ставит тот, кто ведёт механику; у меня её выводит ИИ, разбирая сложность алгоритма в коде команды. Так же оценён и один такт основы игры — насколько он тяжелеет, когда живых и соседей вокруг каждого становится больше. У механики без оценки платформа берёт своё умолчание и пишет «цена не оценена», а такт без оценки не считается вовсе — карта честно помечается неоценённой.
Постоянные части — сколько стоит поднятая карта сама по себе, её земля и каждое существо в памяти — сняты замерами на живом сервере, часть ставок платформа пока принимает оценкой. Игра подставляет своё: площадь, состав существ, частоту тактов и цену своих механик.
У установленной игры тот же расчёт идёт подробнее — на странице её ресурсов в панели управления, с разбивкой по серверам, на которых крутятся её карты: мир раскладывается по нескольким машинам, и как это устроено, я разбирал в 10-й части.
Оговорюсь честно: это оценка по модели, а не счёт по факту, и часть ставок верна в пределах двух-трёх раз. Сняты они на моих картах, и на чужой игре с другим фреймворком разойдутся. Мне важно было другое — чтобы человек, который собирает мир, видел цену своих решений до того, как их примет, а не после.
Отдельно скажу то, ради чего это затевалось. При обычном для MMO онлайне этот мир занимает пару сотен мегабайт и долю одного ядра — это помещается на небольшую машину, из тех, на которых держат сайты. Придёт больше людей — добавляется ещё узел, и миры расходятся по узлам. Не игровой кластер с первого дня: расход я считал и резал с самого начала.
К прошлой части: у схемы переходов появилась проверка прохода
Карта в редакторе выглядит проходимой. На деле у неё бывают области, между которыми хода нет: кусок земли, отрезанный скалой, или помещение, дверь в которое никуда не ведёт.
Схему переходов между картами я показывал в прошлой части — она про двери и отвечает, куда каждая ведёт. Но дверь, которая ведёт правильно, ещё не значит, что до неё можно дойти. Теперь платформа раскладывает проходимые клетки каждой карты на связные области, связывает их переходами и бесшовными стыками и обходит получившийся граф от клетки, где появляется новый персонаж. Ответ простой: вот сюда игрок дойдёт, а сюда — никогда.
В моём мире таких мест 26, и на схеме их видно сразу — по рамкам карт. Мелочь в одну-две клетки у краёв тут тоже есть, но большинство — куски в десятки и сотни клеток. Две карты отрезаны целиком: канализация и летающий остров. А в отрезанном куске у порта стоят пятнадцать существ.
Самое полезное в этой таблице — последний столбец. Отрезанный кусок земли сам по себе бывает задумкой. Вопрос к нему появляется, когда в нём кто-то стоит: пятнадцать существ, которых игрок никогда не встретит, — это ошибка расстановки, найденная до того, как её нашёл игрок.
И результат обхода получает сама игра. Движок берёт готовые области вместе с данными карты и по ним отбивает поиск пути в недостижимую цель, не перебирая клетки. Один и тот же расчёт отвечает и мне на странице, и механике внутри мира.
Чего ИИ не умеет
Инструменты из этой части писал ИИ, ролики собирает он же. Чего он не делает сам:
-
не решает, каким мир должен быть. Сколько существ на поляне и где игрок обязан испугаться, придумывает человек;
-
не отличает задумку от ошибки. Таблица честно перечисляет все 26 отрезанных мест, а какие из них задуманы, решаю я;
-
не придумывает правила подачи. Что считать результатом выпуска и как строится плейлист, задал я — по этим правилам он планирует и снимает сам.
Что дальше
Мир заселён, и видно, куда в нём не дойти. Дальше — то, что делает мир игрой, а не декорацией: добыча с побеждённых, сундуки, торговля у лавочника. Часть из этого уже стоит в игре, и об этом будет следующая часть.
Графика мира пока та, что пришла из The Mana World. Ремастер тайлов — отдельная работа, до которой я дойду позже.
И ещё одно направление, которое я веду параллельно. По-настоящему хорошие игры, я уверен, сделают те, кто придёт на платформу со своим знанием геймдизайна: моя задача — чтобы у них были для этого инструменты. А чтобы показать инструменты в деле, я переношу на платформу старые MMO RPG с открытым кодом и контентом — на их материале снимаются и уроки. The Mana World — первая из них.
Вопрос к вам
Кто запускал свой игровой сервер: как вы заранее прикидывали, сколько железа уйдёт на мир, — считали, мерили на стенде или узнавали по факту после запуска?
История
-
Redis как память игрового мира: сколько игроков и NPC он держит
-
Клиент на Unity для авторитарного сервера: что он обязан уметь
-
Почему персонаж телепортируется: пинг, интерполяция и экстраполяция
-
Event-driven и JSON-RPC: почему игровой сервер не собран из сервисов
-
Не размер пакета: где на самом деле узкое место сетевого сервера
-
MVP авторитарного сервера для 2D MMO: три года и что получилось
-
Конвейер контента для MMO: импорт анимации, экипировка и обновление игры без патчей
-
Каталог ассетов и git для MMO: как командой вести игру в облаке
-
Сколько обходится содержание одного игрока
ссылка на оригинал статьи https://habr.com/ru/articles/1084738/