Сто человек на площади
Мы одновременно запустили в город сто игроков, у каждого аккаунт, два персонажа и команда, они бесцельно бродили и время от времени писали “привет”. Все две минуты никто не вылетел. На этом первая фаза закончилась.
Зачем
В роадмапе было одно условие выхода из первой фазы: город должен выдержать сто человек. Мы предпочли найти предел так, а не по жалобам живых людей в чате.
Как это работает
Открыть сто копий игры на одной машине нельзя, поэтому все сто ботов живут в одной программе, у каждого своё соединение, аккаунт и маршрут. Для сервера это сто разных людей.
Первый результат был хорош по вычислениям и плох по сети. Сервер тратил около 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.