В 2 раза ускорил компиляцию Unity на том же железе

от автора

Меня не устраивало, что мой мини-ПК на Windows 11 с AMD Ryzen 7 7735HS (8 ядер, 16 потоков) и 32 ГБ DDR5 (в одноканальном режиме) компилирует WebGL для яндекс игр в полтора раза дольше, чем MacBook Air M1 с 16 ГБ.

Эта статья о том, как получить двойную скоростью без апгрейда комплектующих! От создания флешки до первого билда с использованием tmpfs и символьных ссылок Symlinks (для одновременной работы над несколькими проектами).


Шаг 1. Подготовка и правильная запись ISO-образа

Для миграции был выбран дистрибутив CachyOS (форк Arch Linux), оптимизированный под современные процессоры (в репозиториях пакеты скомпилированы под инструкции x86-64-v3 с флагами -O3 и LTO).

Скачиваем актуальный образ с официального сайта. Если пишете из-под Windows, используйте Rufus строго в режиме DD-образ (а не ISO).

Шаг 2. Установка системы и выбор окружения

Вставляем флешку, включаем пк. ДЛЯ ФОРМАТИРОВАНИЯ SSD ВЫБИРАЙТЕ XFS!!! В процессе установки CachyOS предложит выбрать графическое окружение. Я выбрал XFCE. Оно легковесное, не нагружает GPU лишними эффектами. Во время кастомизации системы установщик спросит про оптимизированные библиотеки:

Заменить sdl2 на cachyos-extra-v3/sdl2-compact? [y/N]

Нажимаем y (Yes). Это заменит стандартные библиотеки на версии, собранные под архитектуру Zen 3+, что сделает работу самого редактора Unity плавнее. Также в приветственном окне CachyOS Hello обязательно включаем системный демон ananicy-cpp.

Шаг 3. Переключаемся на планировщик BORE

По умолчанию в системе может быть активно ядро EEVDF. Нам для тяжелой компиляции нужен планировщик BORE (Burst-Oriented Response Enhancer). Он идеально распределяет кванты времени процессора, когда все 16 потоков забиты IL2CPP-сборкой, сохраняя интерфейс XFCE отзывчивым.

  1. Открываем встроенную утилиту CachyOS Kernel Manager.

  2. Ищем строку cachyos-v3/linux-cachyos-bore.

  3. Ставим напротив неё галочку, прокручиваем вниз и нажимаем Apply/Execute.

  4. После установки перезагружаем ПК. В меню загрузчика выбираем ядро с припиской bore и нажимаем клавишу d (Default), чтобы оно всегда запускалось по умолчанию. Проверить, что всё получилось, можно в терминале:

uname -r# Должно вывести что-то вроде: 7.0.12-1-cachyos-bore

Шаг 4. Настройка приоритетов в Ananicy-cpp

Утилита ananicy-cpp работает в фоне и управляет приоритетами. Заставим её отдавать всё самое лучшее процессам Unity. Из-за особенностей структуры ananicy-cpp кастомный файл конфигурации нужно создать прямо в корне её директории:

sudo nano /etc/ananicy.d/custom_unity.rules

Вставляем туда две строчки кода (в терминале вставка через Ctrl + Shift + V):

{ "name": "unityhub", "type": "game" }{ "name": "Unity", "type": "game" }

(Тип game заставляет планировщик выделять процессам Unity максимальный приоритет процессора и ввода-вывода). Сохраняем файл (Ctrl + O, затем Enter, затем Ctrl + X для выхода из nano) и перезапускаем службу:

sudo systemctl restart ananicy-cpp

Шаг 5. Радикальное устранение Disk IO: Перенос Library в ОЗУ

Папка Library в проектах Unity состоит из сотен тысяч мелких файлов кэша, метаданных и объектного кода. При сборке WebGL даже быстрый NVMe SSD начинает сильно греться, ловить троттлинг и урезать скорость на операциях случайной записи (Random Write 4K). Мы полностью уберем SSD из этой цепочки, создав виртуальный RAM-диск на 18 ГБ в оперативной памяти (благо у нас её 32 ГБ).

  1. Открываем конфигурацию монтирования дисков:

   sudo nano /etc/fstab
  1. Листаем в самый низ и дописываем строку:

   tmpfs /mnt/unity_ramdisk tmpfs rw,nodev,nosuid,size=18G,mode=1777 0 0
  1. Критически важный нюанс Linux: После последней цифры 0 обязательно нажмите Enter, чтобы перевести курсор на новую пустую строку! Иначе системный парсер fstab может проигнорировать эту запись.

  2. Сохраняем и выходим (Ctrl+O, Enter, Ctrl+X). Теперь создаем физическую папку на диске и активируем монтирование:

sudo mkdir -p /mnt/unity_ramdisksudo mount -asudo systemctl daemon-reload

Проверяем командой df -h | grep unity. Должен появиться раздел на 18 ГБ, работающий со скоростью вашей DDR5.

Шаг 6. Скачиваем Unity через терминал

В CachyOS (как и в Arch) самый быстрый и чистый способ поставить среду разработки — использовать AUR (Arch User Repository). Открываем терминал и запускаем установку Unity Hub:

paru -S unityhub

В процессе paru выведет на экран содержимое технического файла PKGBUILD через утилиту просмотра less. Не пугаемся!!! — просто нажимаем клавишу q на клавиатуре (выход из просмотра), а затем на вопрос Proceed with installation? [Y/n] вводим y и жмем Enter. После завершения открываем Unity Hub из меню приложений, логинимся, скачиваем нужную версию Unity Editor и обязательно ставим галочку напротив модуля WebGL Build Support.

Шаг 7. Автоматизация и обман движка через Bash-скрипт

Unity не умеет переносить Library в другую папку через настройки. Мы свяжем её с RAM-диском с помощью символьных ссылок (symlinks).

  1. Создаем в Unity Hub новый пустой проект (или открываем существующий), например, по пути ~/Develop/MyUnityProject. Закрываем Unity.

  2. Переходим в папку проекта через терминал:

   cd ~/Develop/MyUnityProject
  1. Создаем скрипт запуска:

   nano run_project.sh
  1. Вставляем в него следующий код:

#!/bin/bashPROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"PROJECT_NAME=$(basename "$PROJECT_DIR")RAM_DIR="/mnt/unity_ramdisk/$PROJECT_NAME"echo "=== Запуск проекта $PROJECT_NAME с RAM-диском ==="mkdir -p "$RAM_DIR"if [ -d "$PROJECT_DIR/Library" ] && [ ! -L "$PROJECT_DIR/Library" ]; then    echo "Копируем существующую Library в оперативную память..."    cp -r "$PROJECT_DIR/Library/"* "$RAM_DIR/" 2>/dev/null    rm -rf "$PROJECT_DIR/Library"fiif [ ! -L "$PROJECT_DIR/Library" ]; then    rm -rf "$PROJECT_DIR/Library"     ln -s "$RAM_DIR" "$PROJECT_DIR/Library"    echo "Символьная ссылка на RAM-диск успешно создана."fiecho "Запускаем Unity Hub..."unityhub &

(Этот скрипт универсален: его можно закинуть в корень любого проекта, он сам определит пути). 5. Сохраняем, выходим (Ctrl+O, Enter, Ctrl+X) и делаем его исполняемым:

   chmod +x run_project.sh

Теперь проект нужно запускать строго через этот скрипт командой ./run_project.sh. Он автоматически подменит папку Library ссылкой на ультрабыструю оперативную память, откроет Unity Hub, а вы просто выберете этот проект из списка.

Шаг 8. Тюнинг настроек внутри Unity Editor

Открываем проект через наш скрипт. Идем в Edit ➔ Project Settings ➔ Player ➔ вкладка WebGL (иконка HTML5):

  1. Other Settings ➔ Optimize for: Меняем значение на Optimize for Build Time. Это отключит долгие микро-оптимизации компилятора clang, которые во время разработки нам не нужны.

  2. Publishing Settings ➔ Compression Format: Ставим Disabled. Сжатие билда в Brotli или Gzip сильно нагружает процессор в самом конце сборки. Отключаем его на время тестов (включать стоит только перед финальной загрузкой игры на площадки вроде Yandex Games).

Итог: Результаты замеров

Мы получили двукратное ускорение абсолютно бесплатно, перейдя с ntfs на xfs и настроив tmpfs!

На Windows 11 компиляция WebGL-версии проекта занимала долгие 2 часа. Система упиралась в однопоточную линковку, дисковую активность и планировщик задач. После переезда на оптимизированную CachyOS, переноса кэша сборки в RAM-диск и настройки планировщика BORE, время компиляции на том же самом железе и с той же одноканальной памятью сократилось до 1 часа.

Я намеренно не апгрейдил память до двухканального режима для этого эксперимента, хотя с ним компиляция станет еще быстрее (прирост составит дополнительные 30-50%).

ссылка на оригинал статьи https://habr.com/ru/articles/1049556/