
De lo que estoy hablando aquí es de la horrible combinaciónOptirun/Primusrun + PlayonLinux + Steameso genera envoltorios sobre envoltorios sobre envoltorios (primus/optirun llama a playonlinux, que llama a Wine a través de un montón de scripts de envoltorio, que a su vez llama a Steam, que finalmente llama a tu juego ejecutable)
Y no, no funciona tan bien.
En mi caso el juego en cuestión esAudiosurf(el primero de su nombre), aunque también estoy interesado en hacer que otros juegos (como Skyrim) se ejecuten de la misma manera.
Los hechos
De lo que estoy seguro es que el juego corre. Pero no en la tarjeta nvidia.
He hecho la siguiente prueba estúpida:
Verifique el estado del demonio Bumblebee.
systemctl status bumblebeed
Observe la línea CGroup:Grupo CG: /system.slice/bumblebeed.service
└─809 /usr/sbin/bumblebeedEjecute glxgears en abejorro
primusrun glxgears
Mientras sigue en ejecución
glxgears
, verifique nuevamente si hay abejorros.
systemctl status bumblebeed
CGroup: /system.slice/bumblebeed.service
├─ 809 /usr/sbin/bumblebeed
└─3707 Xorg :8 -config /etc/bumblebee/xorg.conf.nvidia -configdir...Como era de esperar, ahora hay una instancia del servidor X, generado por bumblebee, que se ejecuta
glxgears
en la tarjeta nvidia.Deténgase
glxgears
y vuelva a comprobar: la instancia de X.org desaparecióAhora lanza eljuego de vapora través de
primusrun
primusrun /usr/share/playonlinux/playonlinux --run "Steam" -applaunch 12900
Y verifique el estado de Bumblebee: regrese al paso 1, no hay hijos de Xorg. (Asegúrate de estar dentro del juego cuando hagas eso, no solo en el menú)
Utilicé primusrun porque si el programa no usa la tarjeta gráfica entonces no se genera ninguna instancia de Xorg, mientras que optirun de alguna manera fuerza la creación de instancias de Worg.
Incluso llegué adetenerel demonio abejorro para asegurarse de que el juego todavía se estaba ejecutando (¡NO HAGA ESO! Si el programa realmente se está ejecutando en la tarjeta nvidia, eso no solo congelaría la ventana de su lado, sino que también bloquearía la GPU)
Las conjeturas
Entonces, claro, el juego no se ejecuta en Bumblebee; ¿Pero dónde está el problema?
Tiene que ser porque, en algún lugar, uno de los contenedores genera un nuevo proceso y regresa.Hacer que el proceso objetivo sea inalcanzable para primusrun. ¿Pero quién tiene la culpa?
¿Es uno de los múltiples contenedores que utiliza playonlinux? ¿O es solo vapor?
O tal vez sea incluso más profundo que eso:¿Qué pasa si Audiosurf simplemente no usa opengl?Por supuesto que nonativamente, pero ¿no traduce Wine las llamadas de DirectX a llamadas de OpenGL?
Dejando de lado esa sombría hipótesis, pensé que debería acercarme lo más posible al ejecutable antes de llamar a primusrun. Lo ideal es algo como primusrun wine game.exe
.
Entonces, ¿cómo hago eso?
Bueno, para empezar, encontré el "Comando para ejecutar antes de ejecutar el programa" en el "Misceláneas"pestaña de la ventana de configuración de playonlinux, como lo sugiereesta línea:
Puede utilizar este cuadro para anteponer comandos al acceso directo. Es útil, por ejemplo, en el caso de portátiles con gráficos Nvidia e Intel, y es necesario utilizar el prefijo primusrun u optirun antes de iniciar un juego en particular.
Pero resulta que esto es una completa TONTERÍA.
Después de hurgar un poco en las fuentes de PlayonLinux, encontré al bastardo:
if [ -e "$HOME/.PlayOnLinux/configurations/pre_shortcut/$NAME" ]; then source "$HOME/.PlayOnLinux/configurations/pre_shortcut/$NAME" fi exec ./playonlinux-bash "$HOME/.PlayOnLinux/shortcuts/$NAME" "$@"
El $HOME/.PlayOnLinux/configurations/pre_shortcut/$NAME
archivo es donde se guarda el campo "Comando para ejecutar antes de ejecutar el programa". Como puedes ver, este archivo es source
d, lo que significa que puedes hacer un montón de cosas.antesejecutando el programa (esa sería la última línea con el exec
comando), pero nocomolo estás ejecutando.
Entoncesllamar a cualquier envoltorio como primusrun
en este cuadro sería como golpear el aire.
Sin embargo, siguiendo ese ejemplo, también descubrí que $HOME/.PlayOnLinux/shortcuts/$NAME
contiene una llamada a la POL_Wine
función seguida del archivo .exe real, y eso es todo lo que he llegado a la cadena de contenedores utilizados por POL.
Nota inferior
Me doy cuenta de que me he desviado mucho del tema al entrar en detalles, pero realmente quiero que esta pregunta incluya cualquier juego de Steam que aún no esté disponible de forma nativa en Linux y que pueda tener los mismos problemas, así que intentaré reformular las preguntas aquí (por favor no les respondas simplemente con "Podrías hacerestehackear para que funcione con Audiosurf") :
- ¿Por qué mi juego no se ejecuta en la tarjeta nvidia discreta cuando usé
primusrun
/optirun
? - ¿Qué puedo hacer para solucionar esto?
Respuesta1
Puedo responder a su segunda pregunta: ¿Qué puedo hacer para solucionar este problema?
Lo que queremos hacer es ejecutar Steam a través de PlayonLinux con optirun/primusrun como prefijo. Todos los juegos que ejecutes a través de Steam también se iniciarán automáticamente de esta manera.
tenemos que ir a/usr/share/playonlinux/lib/
Hay un archivo llamado wine.lib
que editaremos.
Importante: cree una copia de seguridad de ese archivo en caso de que algo se rompa.
Dentro del archivo hay una función llamada POL_Wine ()
.
Básicamente lo que queremos cambiar dentro de esta función es la forma en que se ejecuta Wine cada vez que inicias una aplicación a través de PlayonLinux.
Entonces, dentro de esta función debes encontrar todas las partes donde se llama vino. Busque wine "$@"
en el archivo con Ctrl+F en su editor de texto favorito. En mi expediente hubo 3 ocurrencias de wine "$@"
.
Antes de cada aparición, simplemente agregué primusrun
para que parezca primusrun wine "$@"
. Puedes probar optirun
o optirun -b primus
también, pero primusrun
es lo que a mí me funciona.
Así es como se ve ahora la sección que edité:
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
Guarda el archivo e inicia PlayonLinux normalmente.
Puede verificar en cualquier momento si su tarjeta de video discreta se usa o no ejecutando el siguiente comando en una terminal:
optirun --status
Cuando NO se utiliza, la salida se ve así:
Bumblebee status: Ready (3.2.1). X inactive. Discrete video card is off.
Selecciona Steam desde tus aplicaciones de PlayonLinux y ejecútalo. Cuando se inicie, consulte con optirun --status
para ver si su tarjeta discreta está activada.
Mi salida se vio así:
Bumblebee status: Ready (3.2.1). X is PID 26685, 1 applications using bumblebeed.
¡Excelente! ¡Steam ahora está usando tu tarjeta discreta!
Ahora, intentemos iniciar un juego en Steam. Elija uno y ejecútelo normalmente (no es necesario jugar con las opciones de inicio en Steam).
Compruébalo nuevamente con optirun --status
. La salida debería verse así:
Bumblebee status: Ready (3.2.1). X is PID 26685, 2 applications using bumblebeed.
¡Maravilloso! ¡El juego que iniciaste también usa tu tarjeta discreta!
Lo bueno de esto es que funciona con cualquier aplicación que ejecutes a través de PlayonLinux, no solo con Steam.
Para revertir los cambios, simplemente use el archivo de copia de seguridad que creó o simplemente elimine los prefijos que agregó wine.lib
y guarde el archivo. Pruebe todos los diferentes prefijos que mencioné anteriormente si tiene problemas.