Перейти к содержимому

Производительность и как мы ее измеряем

Меняется. Следите: #324, #320

На этой странице собраны замеры клиента и сервера, за которые mcrs может отвечать. Здесь же написано, как их снимали и что пока никто не измерил. Каждая цифра взята из PERF.md, и рядом с каждой указаны машина и сценарий. Сравнений с ванилью, Paper или любым другим сервером здесь нет. Мы не публикуем их, пока бенчмарк mob-bench, описанный ниже, не прогонят на спокойной машине.

Все замеры в PERF.md сделаны на одной машине: Apple M4 Max, 40 ядер GPU, macOS, Metal. Основной дисплей 3840x2160 на 60 Гц. Сборка release, nightly Rust, Bevy 0.19.1, wgpu 29. На Linux и Windows ничего не измеряли. Цифра отсюда говорит, что сделала эта машина, и на вашей машине цифры будут другими.

Цифра - это медиана установившихся строк прогона. Один кадр или среднее мы не приводим, а первые десять секунд после запуска отбрасываем. Два прогона одного сценария расходятся примерно на 0,1 мс на полном кадре (wall frame) и на 0,05-0,2 мс на стадии, поэтому изменение меньше этого считается шумом.

Мы приводим время CPU движка, а не fps, и на пустой сцене видно почему. На macOS полный кадр включает получение изображения свопчейна (swapchain acquire), а этот шаг ждет дисплей. Пустая сцена показывает 3,5 мс полного кадра, и 2,8 мс из них уходит на acquire. Поэтому бюджет привязан к цифре движка, то есть к полному кадру минус acquire, и к временным меткам проходов GPU. Это первая запись в DECISIONS.md.

Время движка читается с MCRS_HOT=1. Эта настройка держит одно ядро занятым, потому что производительные ядра снижают частоту, пока кадр спит. Без нее тот же пустой кадр дает медиану 1,37 мс и p99 4,0 мс, с ней 0,60 и 1,12. По умолчанию настройка выключена, так что игрок при вертикальной синхронизации платит за разгон частоты. Обе цифры есть в DECISIONS.md, где каждое решение записано одной строкой вместе с цифрами, которые его обосновали.

Цель по времени CPU движка - 1,0 мс (PERF.md, Budget). PERF.md помечает замер выше потолка как “over the ceiling”, и эта страница сохраняет такие строки.

У всех трех строк один сценарий: окно 2560x1440, MCRS_HOT=1, оверлей скрыт, сохранение two-relight, дальность прорисовки по умолчанию 96 колонок. Источник - PERF.md, раздел Hardening.

Сценарий Движок, медиана / p99 / максимум Примечание
Пустой кадр (без сервера, только небо) 0,80 / 0,94 / 0,94 мс Нижняя граница движка.
96 колонок, стоим на месте 1,12 / 1,33 / 1,33 мс В памяти 38 025 колонок и 295 511 секций.
96 колонок, полет на максимальной скорости (MCRS_FLY), 120 с 1,56 / 5,0 / 5,9 мс Хвост p99 выше потолка. Два известных источника хвоста не исправлены.

В таблицу не попали три вещи, о которых нужно знать, прежде чем на нее ссылаться.

На 96 колонках кадр упирается в GPU, а не в CPU. Кадр GPU занимает 3,7 мс, выше цели в 1,0 мс. Процесс держит около 12 ГБ, а арены памяти заполнены на 50% из 4,3 ГБ. Этот замер взят из PERF.md, раздел Render distance, и сделан до прохода окклюзии, так что сегодняшняя память может отличаться.

Вид на 96 колонок устанавливается около 80 с при бюджете загрузки 32 МБ (MCRS_UPLOAD=32). С умолчанием в 4 МБ он не устанавливается за четыре минуты.

Установившийся вид показывает 0 КБ загрузки на кадр. В полете клиент загружает от 300 до 450 КБ на кадр.

Что Замер Сценарий
От старта до Playing 0,769 с, медиана трех прогонов (1,007, 0,769, 0,769 с) Release mcrs, без папки мира, порт по умолчанию, M4 Max. Машина была занята (load average 48 на 16 ядрах), так что читайте это как верхнюю границу. Первый прогон читал датапак холодным.
Загрузка реестров 29,1 мс медиана, 147 реестров, 9 079 записей Те же три прогона.

Источник - PERF.md, раздел Server start. Эти два замера служат базовой линией, поэтому более долгий старт в том же сценарии считается регрессией.

  • Память на загруженную секцию и на компонент сущности. README раньше это обещал, а в PERF.md такой таблицы нет. Число попадет в PERF.md, когда его посчитает тест.1
  • Стоимость тика простаивающего сервера и счет тиков с превышением времени.2 Сегодня цикл сервера после превышения сразу начинает следующий тик, без счета и без предупреждения.
  • Время тика сервера под нагрузкой от игроков. Нагрузка ботами есть в crates/mcrs_minecraft_server/examples/tick_load.rs, но ее машина и условия не записаны, поэтому мы ее не приводим.
  • Что-либо на Linux или Windows.

У mob-bench есть метод, но пока нет результатов

Заголовок раздела «У mob-bench есть метод, но пока нет результатов»

benchmarks/mob-bench загружает в один сервер 50 000 свиней и измеряет его тик, использование CPU и движение свиней. Тестовая обвязка лежит в tools/mob-bench. Она прогоняет mcrs, сервер ванили того же снапшота и еще один Rust-сервер через одни и те же фазы: простой, блуждание, скопление, стимул (паника после ударов по части свиней) и стоимость ИИ. Каждая фаза идет с подключенным клиентом и без него.

Результата бенчмарка на этой странице нет, потому что автор помечает первую сессию как предварительную. На машине одновременно шли другие сборки, load average доходил до 84, поэтому в каждом окне замера машина была занята чужой работой. README бенчмарка говорит, что для официальных прогонов нужна спокойная машина.

Полная матрица занимает около 2,5 часов на M4 Max. Чтобы запустить:

Окно терминала
cargo build --release -p mcrs_mob_bench -p mcrs --bins
MINECRAFT_EULA=true tools/mob-bench/run.sh

Другому серверу нужны свой чекаут и файлы, они описаны в README бенчмарка.

Окно терминала
MCRS_STATS=5 ./target/release/mcrs_minecraft_client "<world folder>"

Команда пишет строку F3 в лог каждые пять секунд при скрытом оверлее. Настройки, которые задают сценарий (MCRS_RESOLUTION, MCRS_SERVER, MCRS_FLY, MCRS_HOT), описаны в Переменных окружения. Для обычной игры они не нужны. Для захватов Tracy нужна фича telemetry-tracy.

  1. В работе#324 Отслеживает фиксацию размера компонентов и подсчет памяти секций. ↩

  2. В работе#320 Отслеживает измерение тика простаивающего сервера и отчет о превышениях. ↩

Источники и проверка

Проверено: 26.4-snapshot-7, 51d45c26a, 2026-11-09

Переведено с версии 51d45c26a

Следить: #324, #320