Производительность и как мы ее измеряем
На этой странице собраны замеры клиента и сервера, за которые 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”, и эта страница сохраняет такие строки.
Клиент: кадр движка на 96 колонках
Заголовок раздела «Клиент: кадр движка на 96 колонках»У всех трех строк один сценарий: окно 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 --binsMINECRAFT_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.
Footnotes
Заголовок раздела «Footnotes»Источники и проверка
Проверено: 26.4-snapshot-7, 51d45c26a, 2026-11-09
Переведено с версии 51d45c26a