Как запустить игру steam для windows на bumblebee?

Я говорю об ужасной комбинации Optirun/Primusrun + PlayonLinux + Steam, которая делает обертку за оберткой (primus/optirun вызывает playonlinux, который вызывает wine через кучу скриптов обертки, который в свою очередь вызывает steam, который, наконец, вызывает исполняемый файл вашей игры)

И, нет, это не работает так хорошо.

В моем случае речь идет об игре Audiosurf (первое ее название), хотя я также заинтересован в том, чтобы заставить другие игры (например, Skyrim) работать таким же образом.

Факты

В чем я уверен, так это в том, что игра запускается. Но не на карте nvidia.
Я сделал следующий тупой тест :

  1. Проверьте статус демона bumblebee
    systemctl status bumblebeed
    Посмотрите на строку CGroup:

    CGroup: /system.slice/bumblebeed.service
                  └─809 /usr/sbin/bumblebeed

  2. Запустите glxgears на bumblebee
    primusrun glxgears

  3. Пока все еще работает glxgears, снова проверьте наличие bumblebee
    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

  4. Остановите glxgears и проверьте снова: экземпляр X. org исчез

  5. Теперь запустите steam game через primusrun
    primusrun /usr/share/playonlinux/playonlinux --run "Steam" -applaunch 12900

  6. И проверьте состояние Bumblebee: Вернитесь к шагу 1, нет Xorg child. (Убедитесь, что вы находитесь в игре, а не только в меню)

Я использовал primusrun, потому что если программа не использует видеокарту, то экземпляр Xorg не порождается, в то время как optirun каким-то образом заставляет порождать Worg

Я даже зашел так далеко, что остановил демон bumblebee, чтобы убедиться, что игра все еще запущена (НЕ ДЕЛАЙТЕ ЭТО! Если программа действительно работает на карте nvidia, это не только заморозит окно на вашей стороне, но и затормозит GPU)

Догадки

Итак, верно, игра не запускается на Bumblebee; но где же проблема?

Должно быть, потому что где-то один из обёрток порождает новый процесс и возвращается. Делая целевой процесс недоступным для primusrun. Но кто виноват?
Это одна из многочисленных обёрток, используемых playonlinux? Или это просто steam?

Или, может быть, дело еще глубже: Что если Audiosurf просто не использует opengl? Конечно, не использует нативно, но разве wine не переводит вызовы DirectX в вызовы opengl?


Оставив эту мрачную гипотезу в стороне, я решил, что должен подобраться как можно ближе к исполняемому процессу перед вызовом primusrun. Идеальный вариант - что-то вроде primusrun wine game.exe.

Так как же мне это сделать?

Ну, для начала, я нашел "Команду для выполнения перед запуском программы" на вкладке "Разное" окна конфигурации playonlinux, на что намекает эта строка :

Вы можете использовать это поле для префиксации команд к ярлыку. Удобно, скажем, в случае ноутбуков с графикой Nvidia и Intel, и вам нужно использовать префикс primusrun или optirun перед запуском конкретной игры.

Но оказалось, что это полный BOLLOCKS

Немного поковырявшись в исходниках 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 сохраняется поле "Команда для выполнения перед запуском программы". Как вы можете видеть, этот файл является sourced, что означает, что вы можете делать кучу вещей до запуска программы (это будет последняя строка с командой exec), но не во время ее запуска.

Так что вызов любой обертки типа primusrun в этой коробке будет подобен избиению воздуха.

Тем не менее, следуя дальше по этому пути, я также обнаружил, что $HOME/.PlayOnLinux/shortcuts/$NAME содержит вызов функции POL_Wine, за которой следует настоящий .exe-файл, и это примерно все, до чего я добрался в цепочке оберток, используемых POL.

Нижняя заметка

Я понимаю, что сильно отклонился от темы, углубляясь в детали, но я действительно хотел бы, чтобы этот вопрос включал любую игру steam, еще не доступную на Linux, которая может иметь те же проблемы, поэтому я попытаюсь переформулировать вопросы здесь (пожалуйста, не отвечайте на них просто "Вы можете сделать этот хак, чтобы заставить его работать с Audiosurf"):

  • Почему моя игра не запускается на дискретной карте nvidia, когда я использовал primusrun/optirun?
  • Что я могу сделать, чтобы обойти это?

0
04.10.2016, 01:58
1 ответ

Я могу ответить на ваш второй вопрос. :Что я могу сделать, чтобы решить эту проблему?

Мы хотим запустить Steam через PlayonLinux с префиксом optirun/primusrun. Все игры, которые вы запускаете через Steam, также будут запускаться автоматически.

Нам нужно идти в/usr/share/playonlinux/lib/

Там есть файл с именем wine.lib, который мы будем редактировать.

Важно :Создайте резервную копию этого файла на случай, если что-то сломается.

Внутри файла есть функция с именем POL_Wine ().

По сути, мы хотим изменить внутри этой функции то, как вино выполняется каждый раз, когда вы запускаете приложение через PlayonLinux.

Итак, внутри этой функции вы должны найти все части, где вызывается вино. Найдите 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, и сохраните файл. Попробуйте все различные префиксы, которые я упомянул выше, если у вас возникнут проблемы.

1
28.01.2020, 02:47

Теги

Похожие вопросы