
Я говорю об ужасном сочетанииOptirun/Primusrun + PlayonLinux + Steamэто приводит к появлению оберток над обертками над обертками (primus/optirun вызывает playonlinux, который вызывает wine через кучу скриптов-оберток, который в свою очередь вызывает steam, который в конечном итоге вызывает исполняемый файл вашей игры)
И нет, это не работает так уж хорошо.
В моем случае речь идет об игреАудиосёрф(первое слово в названии), хотя мне также интересно, как заставить работать другие игры (например, Skyrim) таким же образом.
Факты
В чем я уверен, так это в том, что игра запустится. Но не на карте nvidia.
Я провел следующий дурацкий тест:
Проверьте статус демона Bumblebee.
systemctl status bumblebeed
Следите за строкой CGroup:CGroup: /system.slice/bumblebeed.service
└─809 /usr/sbin/bumblebeedЗапустите glxgears на bumblebee
primusrun glxgears
Пока все еще работаете
glxgears
, проверьте еще раз на наличие шмелей.
systemctl status bumblebeed
CGroup: /system.slice/bumblebeed.service
├─ 809 /usr/sbin/bumblebeed
└─3707 Xorg :8 -config /etc/bumblebee/xorg.conf.nvidia -configdir ...Как и ожидалось, теперь есть экземпляр X-сервера, созданный bumblebee, который работает
glxgears
на карте nvidia.Остановитесь
glxgears
и проверьте еще раз: экземпляр X.org исчезТеперь запуститепаровая играчерез
primusrun
primusrun /usr/share/playonlinux/playonlinux --run "Steam" -applaunch 12900
И проверьте статус Bumblebee: вернитесь к шагу 1, нет дочернего Xorg. (Обязательно будьте в игре, когда делаете это, а не просто в меню)
Я использовал primusrun, потому что если программа не использует видеокарту, то экземпляр Xorg не создается, тогда как optirun каким-то образом принудительно создает экземпляр Worg.
Я даже зашёл так далеко, чтоостанавливатьсядемон bumblebee, чтобы убедиться, что игра все еще запущена (НЕ ДЕЛАЙТЕ ЭТОГО! Если программа действительно запущена на карте nvidia, это не только заморозит окно на вашей стороне, но и остановит графический процессор)
Догадки
Итак, игра не работает на Bumblebee; Но в чем проблема?
Должно быть, это происходит потому, что где-то одна из оберток порождает новый процесс и возвращается.Делаем целевой процесс недоступным для primusrun. Но кто виноват?
Это одна из многочисленных оберток, используемых playonlinux? Или это просто steam?
Или, может быть, все еще глубже:А что, если Audiosurf просто не использует OpenGL?Конечно, это не так.изначально, но разве Wine не преобразует вызовы DirectX в вызовы OpenGL?
Оставив эту мрачную гипотезу в стороне, я решил, что мне следует подобраться как можно ближе к исполняемому файлу, прежде чем вызывать primusrun. Идеал — что-то вроде primusrun wine game.exe
.
Так как же мне это сделать?
Ну, для начала, я нашел "Команду для выполнения перед запуском программы" в "Разнообразный" вкладка окна конфигурации playonlinux, как намекаетэта линия:
Вы можете использовать это поле для добавления префикса команд к ярлыку. Удобно, например, в случае ноутбуков с графикой Nvidia и Intel, и вам нужно использовать префикс primusrun или optirun перед запуском определенной игры.
Но оказывается, это полная чушь.
Немного покопавшись в исходниках PlayonLinux, я нашел эту штуку:
if [ -e "$HOME/.PlayOnLinux/configurations/pre_shortcut/$NAME" ]; then source "$HOME/.PlayOnLinux/configurations/pre_shortcut/$NAME" fi exec ./playonlinux-bash "$HOME/.PlayOnLinux/shortcuts/$NAME" "$@"
Файл $HOME/.PlayOnLinux/configurations/pre_shortcut/$NAME
, в котором сохраняется поле "Команда для выполнения перед запуском программы". Как вы видите, этот файл source
d, что означает, что вы можете делать кучу вещейдозапуск программы (это будет последняя строка с exec
командой), но некаквы им управляете.
Такназывать любую обертку, как primusrun
в этой коробке, было бы как битье в воздух.
Тем не менее, продолжая эту мысль, я также обнаружил, что $HOME/.PlayOnLinux/shortcuts/$NAME
содержит вызов функции POL_Wine
, за которым следует сам .exe-файл, и это все, что я смог узнать о цепочке оболочек, используемых POL.
Нижняя нота
Я понимаю, что сильно отклонился от темы, вдаваясь в подробности, но я действительно имел в виду, что этот вопрос касается любой игры Steam, которая еще не доступна на Linux и может иметь те же проблемы, поэтому я попытаюсь переформулировать вопросы здесь (пожалуйста, не отвечайте на них просто «Вы могли бы сделать этоэтотхак, чтобы заставить его работать с Audiosurf"):
- Почему моя игра не запускается на дискретной карте NVIDIA, когда я использую
primusrun
/optirun
? - Что я могу сделать, чтобы обойти эту проблему?
решение1
Я могу ответить на ваш второй вопрос: что я могу сделать, чтобы обойти эту проблему?
Мы хотим запустить Steam через PlayonLinux с optirun/primusrun в качестве префикса. Все игры, которые вы запускаете через Steam, также будут запускаться автоматически таким образом.
Мы должны пойти в/usr/share/playonlinux/lib/
Там есть файл, wine.lib
который мы будем редактировать.
Важно: создайте резервную копию этого файла на случай, если что-то пойдет не так.
Внутри файла есть функция под названием POL_Wine ()
.
По сути, мы хотим изменить внутри этой функции способ выполнения Wine каждый раз, когда вы запускаете приложение через PlayonLinux.
Итак, внутри этой функции вам нужно найти все части, где вызывается wine. Найдите wine "$@"
в файле ctrl+F в вашем любимом текстовом редакторе. В моем файле было 3 вхождения wine "$@"
.
Перед каждым появлением я просто добавлял, primusrun
чтобы это выглядело как primusrun wine "$@"
. Вы можете попробовать optirun
или optirun -b primus
также, но primusrun
это то, что работает для меня.
Вот как сейчас выглядит отредактированный мной раздел:
if [ "$POL_OS" = "Linux" ] || [ "$POL_OS" = "Mac" ];
then
if [ "$LOGFILE" = "/dev/null" ]; then
$BEFORE_WINE $(POL_Config_Read BEFORE_WINE) primusrun wine "$@" 2> >(grep -v menubuilder --line-buffered | tee -a "$WINEPREFIX/playonlinux.log" >&2) > >(tee -a "$WINEPREFIX/playonlinux.log")
errors=$?
else
$BEFORE_WINE $(POL_Config_Read BEFORE_WINE) primusrun wine "$@" 2> >(grep -v menubuilder --line-buffered | tee -a "$LOGFILE" "$WINEPREFIX/playonlinux.log" >&2) > >(tee -a "$LOGFILE" "$WINEPREFIX/playonlinux.log")
errors=$?
fi
else
# FIXME
$BEFORE_WINE $(POL_Config_Read BEFORE_WINE) primusrun wine "$@" 2> "$WINEPREFIX/playonlinux.log" > "$WINEPREFIX/playonlinux.log"
errors=$?
fi
Сохраните файл и запустите PlayonLinux в обычном режиме.
Вы можете в любое время проверить, используется ли ваша дискретная видеокарта, выполнив следующую команду в терминале:
optirun --status
Если он НЕ используется, вывод выглядит так:
Bumblebee status: Ready (3.2.1). X inactive. Discrete video card is off.
Выберите Steam из приложений PlayonLinux и запустите его. Когда он запустится, проверьте, optirun --status
активирована ли ваша дискретная карта.
Мой вывод выглядел так:
Bumblebee status: Ready (3.2.1). X is PID 26685, 1 applications using bumblebeed.
Отлично! Steam теперь использует вашу дискретную карту!
Теперь попробуем запустить игру в Steam. Выберите одну и запустите ее как обычно (не нужно возиться с параметрами запуска в Steam).
Проверьте еще раз с помощью optirun --status
. Вывод должен выглядеть так:
Bumblebee status: Ready (3.2.1). X is PID 26685, 2 applications using bumblebeed.
Замечательно! Игра, которую вы запустили, также использует вашу дискретную карту!
Прелесть этого решения в том, что оно работает с любым приложением, запущенным через PlayonLinux, а не только со Steam.
Чтобы отменить изменения, просто используйте созданный вами файл резервной копии или просто удалите добавленные вами префиксы wine.lib
и сохраните файл. Попробуйте все разные префиксы, которые я упомянул выше, если у вас возникнут проблемы.