Все об Arch Linux

Arch Linux будет тем, что вы из него сделаете!

Vulkan-слои для отладки: MangoHud и LACT

Оверлей с FPS, температурами и частотами GPU не встроен в игру — его рисует слой Vulkan, который подмешивается в цепочку вызовов API. На Arch Linux такую картину даёт MangoHud, а LACT отвечает за другую сторону дел: температуру, вентиляторы, лимит питания и андервольт на картах AMD. Оба ставятся из репозитория, не конфликтуют друг с другом и вместе дают полную картину нагрузки.

Что такое Vulkan-слои и почему оверлей не встроен в игру?

Vulkan-приложение само не рисует счётчик кадров — этим занимается слой загрузчика. vkloader при старте читает манифесты из /usr/share/vulkan/explicit_layer.d/ и /usr/share/vulkan/implicit_layer.d/, а переменная VK_LAYER_PATH меняет каталог поиска. Слой подменяет часть функций Vulkan API, поэтому видит тайминги кадров и параметры GPU, не меняя логику самой игры.

Слои делятся на два типа. Явные (explicit) включаются по запросу приложения или через переменные окружения. Неявные (implicit) подхватываются всегда, без чьего-либо запроса, и живут в системных каталогах. MangoHud кладёт манифесты в оба каталога, поэтому работает и как явный слой (mangohud game), и как неявный, если сделать симлин.

Если слой не подхватывается, начинать отладку лучше не с MangoHud, а с драйвера и выбора Vulkan-движка — про RADV, VK_ICD_FILENAMES, VK_DRIVER_FILES и связку с Steam читайте в материале про настройку amdgpu и Mesa для игр.

Как поставить MangoHud и включить оверлей в игре?

sudo pacman -S mangohud lib32-mangohud

Нативным 64-битным играм хватает пакета mangohud, а 32-битным (Steam Linux Runtime 32, часть Wine-префиксов) нужен lib32-mangohud. Без него оверлей просто не появится, ошибок в логах тоже не будет.

Проверка перед запуском игр:

mangohud vkcube
mangohud --dlsym vkcube

Ключ --dlsym заставляет MangoHud перехватывать вызовы через dlsym вместо Vulkan-слоя — запасной путь для игр и портов, которые грузят драймин свой слой или обходят загрузчик.

В Steam оверлей подключается через «Настройка» → «Параметры запуска»:

mangohud %command%

Ничего глобального менять не нужно: оверлей включается только в этой игре и так же легко выключается удалением строки. Если слои лежат в нестандартном месте, укажи путь явно, иначе загрузчик перестанет их находить:

export VK_LAYER_PATH=/usr/share/vulkan/explicit_layer.d
mangohud vkcube

Как настроить MangoHud через конфиг?

Оверлей настраивается без перезапуска: правишь файл и сохраняешь, изменения подхватываются на следующем запуске игры.

mkdir -p ~/.config/MangoHud
nano ~/.config/MangoHud/MangoHud.conf
# ~/.config/MangoHud/MangoHud.conf
fps
fps_limit=0
gpu_stats
cpu_stats
ram
vram
temp
refresh_rate=1
fps_max=240
fontsize=20
position=top_left
background_alpha=0.5

fps_limit=0 отключает лимит, положительное значение задаёт потолок, а fps_limit=-1 только показывает текущий лимит, не ограничивая кадры. refresh_rate — период опроса в секундах, fps_max — верхняя граница графика, position принимает девять значений от top_left до bottom_right, background_alpha — прозрачность фона от 0 до 1. Полный список с описаниями выдаёт mangohud --list-options, а хоткеи (toggle_fps, toggle_fps_only, toggle_hud) настраиваются в том же файле. Если игра или лаунчер сбрасывают окружение, помогает MANGOHUD_CONFIG=1 — заставить читать файл конфигурации.

Про то, когда лимит кадров полезнее, чем разгон частот, — в разборе низкой частоты кадров на Ryzen iGPU.

Как LACT управляет вентиляторами, питанием и андервольтом?

MangoHud только показывает цифры, а вот управлять ими позволяет LACT — утилита для карт AMD, которая через sysfs драйвера меняет кривую вентиляторов, лимит питания, рабочие состояния и, где позволяет ядро, напряжение.

sudo pacman -S lact
systemctl --user enable --now lactd
lact show

Демон живёт в пользовательской сессии (lactd.service), команда lact show выводит текущее состояние в терминал, а lact без аргументов открывает графический интерфейс. Проект переехал в организацию kgpu-dev, и свежие сборки лежат именно там, вместе с поддержкой NVIDIA.

В окне LACT полезны четыре блока:

  • Fans — кривая «температура → обороты в процентах», точки тянутся мышью. Нулевая точка означает полностью остановленный вентилятор, что экономит фон, но опасно под нагрузкой.
  • Power — лимит мощности (powercap) и список состояний pp_dpm. Занижаешь для тихого режима, поднимаешь ради стабильного буста.
  • Voltage — андервольт через pp_od_clk_voltage. Поля остаются серыми, если драйвер или версия ядра не отдают нужные дескрипторы, и никакой твик это не обойдёт.
  • Прочее — переключение DCP на ноутбуках, сброс к значениям из BIOS, ручной PWM.

Те же значения можно зашить в конфиг (по умолчанию /etc/lact/config.toml) и применять без графического окна. На NVIDIA аналогичные ручки крутятся через Coolbits — разбор есть в статье про перегрев и вентиляторы Coolbits.

Как соединить MangoHud и LACT в Steam?

Схема простая: LACT работает как системный демон и меняет состояние железа независимо от способа запуска, а MangoHud подключается к конкретной игре. Поэтому параметр запуска нужен только для оверлея:

gamemoderun mangohud %command%

Если геймлаунч идёт через gamescope, оверлей лучше вставить внутрь команды — снаружи gamescope его не увидит:

gamescope -f -- mangohud %command%

Для отдельных случаев хватает переменных окружения: MANGOHUD=0 отключает оверлей, MANGOHUD_CONFIG=<путь> подключает отдельный конфиг, а MANGOHUD=1 включает слой принудительно, если игра пытается его выключить. Кривую вентиляторов и лимит питания через launch options не передать, они живут в демоне LACT.

Почему глобальный VK_INSTANCE_LAYERS ломает игры?

Самый частый способ испортить себе оверлей — вписать слой в переменные окружения глобально:

export VK_INSTANCE_LAYERS=VK_LAYER_MangoHud

Так делать не стоит по трём причинам. Переменная достаётся каждому процессу в системе, включая композитор Wayland, утилиты вулкана и фоновые службы. Она заменяет список слоёв, который приложение передало загрузчику, из-за чего теряются другие полезные слои. И если баг в слое роняет игру, отключить слой точечно не выйдет. У современного загрузчика есть более аккуратные VK_LOADER_LAYERS_ENABLE и VK_LOADER_LAYERS_DISABLE.

Если оверлей нужен во всех Vulkan-играх разом, включи слой как неявный:

ls /usr/share/vulkan/*_layer.d/
sudo mkdir -p /etc/vulkan/implicit_layer.d
sudo ln -s /usr/share/vulkan/explicit_layer.d/MangoHud.json \
         /etc/vulkan/implicit_layer.d/MangoHud.json

Путь к манифесту слегка отличается от версии к версии, поэтому сначала проверь, что лежит в explicit_layer.d. Сбросить оверлей для отдельных игр и лаунчеров проще всего переменной MANGOHUD=0, а для портов, которые игнорируют слой, помогает mangohud --dlsym %command%.

Сколько стоит оверлей по кадрам?

Разработчики MangoHud говорят об одном проценте потерь, и в большинстве игр это правда. Реальные 2–5% встречаются в сценах, упирающихся в CPU: там кадр и так на пределе, и опрос слоя съедает часть бюджета времени. В GPU-bound сценах оверлей почти невидим, потому что простаивающий GPU скрывает его нагрузку.

Дешевле всего «голый» счётчик кадров, дороже всего всё сразу: cpu_stats, vram, ram плюс частый опрос. Что можно урезать:

  • поднять refresh_rate до 2–5 секунд;
  • отключить cpu_stats и vram, если не ловишь конкретную проблему;
  • не включать autostart_log и log_interval без нужды, запись даёт больше всего;
  • на скриншотах и бенчмарках ставить MANGOHUD=0, чтобы не мерить слоем.

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

Оверлей не появляется в игре — что проверить?

Проверь параметр запуска (mangohud %command%), наличие lib32-mangohud для 32-битных игр и содержимое ls /usr/share/vulkan/*_layer.d/. Лаунчеры вроде Heroic или Lutris иногда выставляют MANGOHUD=0 — это видно через echo $MANGOHUD. Игры с античитом под Linux слои не подхватывают, там остаётся только нативный счётчик самой игры. Если ничего не помогло, пробуй mangohud --dlsym %command%.

LACT показывает 0 RPM на вентиляторе — это нормально?

Да, если кривая построена так, что до порога вентилятор стоит: MangoHud не слышно, пока карта холодная. Проверь, что точка остановки не завышена, иначе под нагрузкой карта останется без обдува. На части ноутбуков вентилятором управляет прошивка через встроенный контроллер, и LACT там ничего не изменит — на десктопных картах доступ полный.

Можно ли ограничить FPS средствами MangoHud?

Да, fps_limit=30 в конфиге или fps_limit=30 в переменных окружения работает независимо от драйвера, ограничение видит и сама игра, и оверлей. Оно удобно тем, что не требует перезагрузки драйвера и одинаково ведёт себя на любой карте.

MangoHud подтормаживает — что отключить?

Первым делом увеличь refresh_rate до 2–3 секунд, затем выключи cpu_stats и vram, затем запись логов. Если оверлей нужен не в каждой игре, проще держать его на параметрах запуска у избранных игр, а остальные запускать без него.

Полезные ресурсы

  • ArchWiki: MangoHud — параметры конфигурации, переменные окружения, примеры запуска.
  • ArchWiki: LACT — установка демона, доступные опции и настройка через конфиг.

Заключение

MangoHud и LACT закрывают разные задачи и потому спокойно уживаются: первый рисует оверлей и следит за слоями Vulkan, второй управляет вентиляторами, питанием и андервольтом на AMD. Ставь их из репозитория, включай оверлей через параметры запуска игры, а конфиг держи в ~/.config/MangoHud/MangoHud.conf — и вместо угадывания причин фризов ты получишь цифры, по которым уже можно принимать решения.



Не получилось? Поможем настроить

Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Читайте также

Комментарии

Загрузка…

Откроется GitHub: создайте новый issue с вашим комментарием (кнопка «Submit new issue»). После отправки обновите эту страницу — комментарий появится ниже.

Telegram Max