MushRog

Сто человек на площади

12 октября 2026 г. arquiteturabastidores

Машинный перевод, ещё не проверен.

Мы одновременно запустили в город сто игроков, у каждого аккаунт, два персонажа и команда, они бесцельно бродили и время от времени писали “привет”. Все две минуты никто не вылетел. На этом первая фаза закончилась.

Зачем

В роадмапе было одно условие выхода из первой фазы: город должен выдержать сто человек. Мы предпочли найти предел так, а не по жалобам живых людей в чате.

Как это работает

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

Первый результат был хорош по вычислениям и плох по сети. Сервер тратил около 7 миллисекунд на tick при бюджете в 50, но каждый игрок получал примерно 16 КБ в секунду. Все появляются в одной точке, поэтому каждый видел человек тридцать других, а позиции шли в универсальном формате, полном текста.

Мы заменили его бинарным пакетом: короткий номер для каждого игрока, позиция в целых пикселях и направление в двух байтах. Получается восемь байт на каждого видимого человека. Трафик упал до 2,6 КБ в секунду на игрока, в шесть раз меньше, и это спокойно помещается в мобильное соединение.

Метрика (100 игроков)ДоПосле
Средний tick сервера~7 мс~7 мс
Худший tick~40 мс~40 мс
Отправлено на игрока~15,8 КБ/с~2,6 КБ/с

Это было на машине для разработки, где сервер и боты делили один процессор, так что на настоящем сервере запас должен быть больше. Худший tick в 40 мс появляется на пиках, и именно за ним мы будем следить, когда город вырастет.

Следующий шаг

Фаза 2: остальные системы, начиная с настоящего инвентаря и фермы.

Изменения

  • perf(city): 8-byte binary city snapshots; 100-bot load test passes

    CityCodec packs each visible player as u16 id, u16 x, u16 y, s8 dir x/y; static info carries the short id once. Load tool runs many bots in one process with a SceneMultiplayer per bot; server prints tick and bandwidth stats with --stats. 100 of 100 bots stayed in the city for 2 minutes: ~7 ms average tick, bandwidth per player down from ~15.8 to ~2.6 KB/s. Closes fase 1; roadmap moves to fase 2. Protocol 6.

← Назад к девлогу