Rust против Java: почему переписанный Minecraft быстрее — простыми словами

Почему Horizon на Rust плавнее Java Edition: сборщик мусора, прогрев JIT, память, фоновые потоки и пакетная отрисовка. И где Java пока быстрее — с цифрами.

Автор: редакция MC Horizon · Опубликовано · Обновлено

Horizon плавнее Java Edition не потому, что Rust «магически быстрее», а потому, что в нём нет виртуальной машины Java: ни пауз сборщика мусора, ни прогрева кода во время игры. Добавьте к этому меньший расход памяти, работу с чанками в фоновых потоках и пакетную отрисовку — и получите меньше подлагиваний. При этом есть места, где Java пока быстрее, и о них тоже честно.

Что на самом деле измеряют

Средний FPS — плохая мера «плавности». Игра на 120 FPS с одним кадром в 200 мс каждые пару секунд ощущается хуже, чем ровные 60. Поэтому проект Horizon в своих замерах считает подлагивания: кадры дольше одного обновления экрана 60 Гц (вы видите одну картинку дважды) и долгие фризы — ниже 30 FPS. На ноутбуке 2016 года (дальность прорисовки 12) у Horizon 242 подлагивания в минуту против 470 у Java Edition, у Mac mini — ноль против 423, у игрового ПК — примерно на 70% меньше.

Пять причин, по-человечески

Java Edition: ровные кадры и редкие долгие — пауза GC или компиляция Horizon: нет виртуальной машины — меньше одиночных «провалов» высота столбика = время кадра
Условная схема: важны не средние кадры, а редкие длинные — их и убирает отсутствие JVM.

1. Нет сборщика мусора

Java сама освобождает ненужную память — периодически «останавливает мир» и убирает мусор. Minecraft создаёт много временных объектов, поэтому такие паузы заметны как одиночные подвисания. Rust освобождает память сразу, в момент, когда объект больше не нужен: пауз уборки просто нет.

2. Нет прогрева кода

Java-машина сначала интерпретирует код, а самые горячие участки компилирует в машинный код уже во время игры. Первые минуты в новом месте поэтому могут подтормаживать. Horizon скомпилирован под вашу систему заранее.

3. Меньше памяти

У каждого Java-объекта есть служебный заголовок, а сама JVM занимает место. В замерах на ноутбуке Horizon использовал 0,8 ГБ против 2,0 ГБ — Java нужно в 2,6 раза больше, что ощутимо на компьютере с 8 ГБ. Меньше памяти — меньше промахов кэша процессора.

4. Работа вне главного потока

В Horizon чанки генерируются, освещаются и превращаются в геометрию на рабочих потоках, а выгруженные чанки пишутся на диск в фоне. Главный поток меньше отвлекается — меньше скачков времени кадра.

5. Меньше вызовов отрисовки

Секции рельефа лежат в одном общем буфере и рисуются одним «множественным» вызовом на проход. Мобы и блок-сущности вне поля зрения пропускаются, пещеры, в которые не видно, отсекаются. Видеокарта меньше ждёт процессор.

Где Java пока быстрее

  • Загрузка нового рельефа. На том же ноутбуке Java подгрузила новые чанки за 46,9 с, Horizon — за 59,7 с. Проект называет более ровные кадры на больших дальностях работой, которая ведётся сейчас.
  • Средний тик сервера. В серверном бенчмарке (4-поточный i7-7500U, 1–50 ботов) у Paper средний тик был короче при любом числе игроков. Зато horizon-server занимал 0,7–1,1 ГБ памяти против 3,4–4,5 ГБ у Java-серверов, стартовал за 8–9 секунд и при 50 игроках держал 20 TPS, как и Paper.

Это хорошая иллюстрация: язык даёт инструменты, но конкретные алгоритмы и годы оптимизаций Paper тоже никуда не делись.

Почему это не маркетинг

Все цифры выше — из открытых замеров проекта с описанной методикой (одинаковый мир, маршрут, настройки, медианы нескольких прогонов) и с разделом «где Java Edition всё ещё быстрее». Проверить их на своём компьютере можно встроенным бенчмарком — как, рассказываем в статье «Как поднять FPS в Horizon». А сравнение с популярными модами-оптимизаторами — в «Horizon против Sodium, Iris и OptiFine».

Почему тогда не переписать всё

Переписать игру с нуля — огромная работа, и главная трудность не в языке, а в том, чтобы совпасть с оригиналом до мелочей: генерация мира, редстоун, поведение мобов. Horizon решает это автоматическими тестами против настоящей 26.3 — подробнее в статье о дифференциальных харнессах.

Что это значит для вас

Если Java Edition у вас «вроде бы 100+ FPS, но дёргается» — Horizon, скорее всего, ощутимо поможет. Если вы летаете на элитрах по новым землям — разница будет меньше, а загрузка чанков может быть даже медленнее. Попробовать недолго: установка занимает 10 минут, а миры открываются те же. Начать знакомство можно со статьи «Что такое Horizon».

Источники

Частые вопросы

Значит ли это, что Rust всегда быстрее Java?

Нет. Язык даёт инструменты, а скорость зависит от того, как написан код. В тех же замерах Java Edition быстрее загружает новый рельеф, а на сервере Paper показывает более короткий средний тик.

Почему в Java Edition лагает, даже когда FPS высокий?

Средний FPS скрывает отдельные долгие кадры. Паузы сборщика мусора и компиляция кода «на лету» дают именно такие одиночные подвисания.

Комментарии

Комментарии загрузятся, когда вы до них долистаете.