В ноутбуке с Intel или AMD и отдельной NVIDIA почти всегда работает гибридная графика: картинку на экран выводит встроенный чип, а дискретная карта подключается на время запуска игры. Если запустить тяжёлый проект без prime-run, он получит встроенную графику и упрётся в её производительность. Разбираемся, как заставить процесс рендериться на нужной видеокарте, чем выбирать GPU для каждой игры в Steam и почему вместо этого получается рваный кадр.
Две видеокарты в ноутбуке делят работу так: встроенная всегда включена в питание и выводит изображение, дискретная для картинки не нужна и может спать, экономя батарею. Управляет этим модуль nvidia_drm, а переключение называется PRIME. Полный порядок установки драйвера и модулей ядра я разбирал в статье про драйвер NVIDIA на Arch Linux — без него остальные команды не имеют смысла.
Режимов четыре:
Ключевое условие для hybrid и dGPU only — параметр ядра nvidia_drm.modeset=1 (в новых драйверах дополнительно nvidia_drm.fbdev=1). Без него встроенная карта не сможет отдать изображение на внешний дисплей, и ноутбук уходит в чёрный экран. Подробности сборки строки ядра и проверки результата — в статье о параметрах ядра из командной строки.
В Arch есть готовый скрипт prime-run из пакета nvidia-utils. Он подставляет две переменные окружения и запускает твою программу:
prime-run steam
prime-run glxinfo -B
Внутри всё выглядит настолько просто, что ручную форму стоит запомнить:
__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia black
__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia /usr/bin/игра
Первая переменная говорит glvnd, что нужен офлоад на дискретную карту, вторая выбирает библиотеку NVIDIA вместо Mesa. Для OpenGL, EGL и Vulkan в драйвере этого достаточно, чтобы процесс получил контекст на GeForce.
Два ограничения, о которые чаще всего спотыкаются:
VK_DRIVER_FILES=/usr/share/vulkan/icd.d/nvidia_icd.json /usr/bin/игра
prime-run не выводит изображение на экран силами NVIDIA. В hybrid режиме вывод остаётся на встроенной карте, поэтому сам по себе скрипт не избавит тебя от рваного кадра — об этом ниже.В свойствах игры есть поле Launch Options (Параметры запуска). Туда пишешь одну строку, а вместо команды игры Steam подставляет %command%:
# дискретная NVIDIA
prime-run %command%
# или то же самое вручную
__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia %command%
# встроенная карта (0 — видеокарта по умолчанию)
DRI_PRIME=0 %command%
# игра на Vulkan, принудительно на NVIDIA
VK_DRIVER_FILES=/usr/share/vulkan/icd.d/nvidia_icd.json %command%
Требования к строке простые: %command% остаётся последним, ничего не заворачивай в bash -c, не добавляй setarch без нужды. Работает и с нативными играми, и с Proton, потому что переменные окружения наследуются всей цепочкой процессов.
Быстрый способ убедиться, что попал в нужную карту, — включить оверлей MangoHud: он показывает имя вендора, устройство и версию драйвера прямо поверх картинки. Если в списке нет NVIDIA, значит параметры запуска не применились или игра проигнорировала их.
В KDE Plasma есть собственный профиль выбора GPU для приложений, в GNOME удобнее оставить одну строку в параметрах запуска. Два способа не смешивай: либо штатный профиль окружения, либо ручная строка переменных.
Здесь работает DRI_PRIME — переменная, которую читает glvnd и Mesa. Значение 0 означает видеокарту по умолчанию, положительное число — номер следующей в списке:
DRI_PRIME=1 glxinfo -B
DRI_PRIME=1 glxgears
MESA_LOADER_DRIVER_OVERRIDE=radeonsi glxinfo -B
MESA_LOADER_DRIVER_OVERRIDE пригождается, когда карта одна и та же, а нужен конкретный драйвер: radeonsi для AMD, iris или iHD для Intel. Аналог для VA-API — LIBVA_DRIVER_NAME=radeonsi intel-media-driver.
Этот каталог — список вендоров EGL, которые glvnd пробует по очереди. После установки драйверов там лежат несколько файлов:
ls -1 /usr/share/glvnd/egl_vendor.d/
cat /usr/share/glvnd/egl_vendor.d/10_nvidia.json
pacman -Qo /usr/share/glvnd/egl_vendor.d/10_nvidia.json
Нумерация задаёт приоритет: 10_nvidia.json от NVIDIA, 20_amd.json и 20_intel.json от Mesa, 50_mesa.json — общий. Проблема выглядит так: приложение на Qt или GTK подхватывает libEGL_nvidia.so.0, падает без сообщения или рисует чёрный кадр. Править файлы в /usr/share смысла нет — их перезапишут при обновлении пакетов. Вместо этого переопределяй список переменной:
__EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/50_mesa.json black
Так EGL-приложения всегда пойдут через Mesa, а настройка живёт в параметрах запуска игры, а не в системе.
Рваный кадр (screen tearing) в гибридной схеме появляется почти всегда. Игра считает кадры на NVIDIA, компоновщик на стороне встроенной карты показывает промежуточные буферы, а единого пути синхронизации между ними нет. Классический VSync в игре не помогает — он рассчитан на один GPU, который и выводит картинку.
Что реально работает, от лучшего к худшему:
nvidia-settings → X Server Display Options: композитор рисует сцену на NVIDIA, синхронизация появляется ценой небольшой задержки ввода.nvidia_drm.modeset=1 и бэкенд GBM. Проверяй статус плагина в настройках композитора: если он не активирован, игра уйдёт в X11.Если рваный кадр мешает больше, чем расход батареи, посмотри ещё на связку VRR/FreeSync на встроенной карте: она убирает разрывы без переключения режима питания. Обновление ядра или Plasma иногда ломает работу композитора, и тогда настройки из раздела про драйвер приходится перепроверять заново.
Угадывать по счётчику FPS бессмысленно — есть одна команда, которая отвечает на вопрос прямо:
glxinfo -B | grep -E "OpenGL vendor|OpenGL renderer"
prime-run glxinfo -B | grep -E "OpenGL vendor|OpenGL renderer"
DRI_PRIME=1 glxinfo -B | grep -E "OpenGL vendor|OpenGL renderer"
В строке OpenGL renderer string у NVIDIA будет «GeForce» и «NVIDIA Corporation», у AMD — «AMD Radeon» или «AMDANGLE», у Intel — «Intel» и «Mesa». Запусти все три команды подряд и сравни вывод: он покажет и дефолт, и принудительный офлоад, и встроенную карту.
Дополнительно полезны:
nvidia-smi # драйвер, температура, память, есть ли нагрузка
lspci -nnk | grep -A3 -E "VGA|3D controller" # какой драйвер привязан к карте
vulkaninfo --summary | grep -i deviceName
glxinfo ставится из mesa-utils, vulkaninfo — из vulkan-tools. Если в выводе renderer не поменялся после prime-run, проверь параметр nvidia_drm.modeset=1 в командной строке ядра и состояние dGPU:
cat /sys/bus/pci/devices/0000:01:00.0/power/control
echo auto | sudo tee /sys/bus/pci/devices/0000:01:00.0/power/control
Адрес 0000:01:00.0 у каждого ноутбука свой — выпиши его из вывода lspci. Значение auto включает энергосбережение, при котором карта просыпается только на время игры.
prime-run: command not found — что делать?Скрипт лежит в пакете nvidia-utils:
sudo pacman -S nvidia-utils
Если пакет стоит, проверь command -v prime-run и переменную PATH. Альтернатива, работающая всегда, — длинная строка с __NV_PRIME_RENDER_OFFLOAD=1, руками вбитая в параметры запуска.
Проверяй по порядку: renderer в glxinfo -B, параметр nvidia_drm.modeset=1, правильность строки %command% и то, не перебивает ли переменные штатный профиль выбора GPU в твоём окружении. Для Vulkan-игр сначала попробуй VK_DRIVER_FILES — prime-run на них не действует.
Убери prime-run и DRI_PRIME из параметров запуска, убедись, что nvidia-smi показывает нулевую загрузку и температуру близкую к простой, и верни auto в /sys/bus/pci/devices/*/power/control. Запись в sysfs не переживает перезагрузку, поэтому для постоянного режима нужен systemd-юнит или хук udev. Если карта всё равно не засыпает, помогают подробные настройки питания и охлаждения, о которых я писал в материале про перегрев NVIDIA и Coolbits.
На ветке 340–390 модуль NVIDIA не умеет офлоад на встроенную карту, ноутбук работает только в режиме dGPU only, а переключение выполняется кнопкой, BIOS или утилитой вендора. Подробности — в статье про старые драйверы NVIDIA 340–390 на новом ядре. На таких системах prime-run бесполезен, переключение живёт в железе.
Гибридная графика — не приговор: одна переменная в параметрах запуска решает, какая карта считает кадры, а glxinfo -B всегда покажет результат. Держи под рукой рычаги: prime-run для офлоада, DRI_PRIME для встроенной карты, VK_DRIVER_FILES для Vulkan и режим dGPU only, когда рваный кадр важнее экономии батареи.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии