
Estou falando aqui da horrível combinaçãoOptirun/Primusrun + PlayonLinux + Steamisso cria wrappers sobre wrappers sobre wrappers (primus/optirun chama playonlinux, que chama wine através de um monte de scripts wrapper, que por sua vez chama steam, que finalmente chama seu jogo executável)
E não, não funciona tão bem.
No meu caso o jogo em questão éAudiosurf(primeiro nome), embora eu também esteja interessado em fazer outros jogos (como Skyrim) rodarem da mesma maneira.
Os fatos
O que tenho certeza é que o jogo roda. Mas não na placa Nvidia.
Eu fiz o seguinte teste estúpido:
Verifique o status do daemon bumblebee
systemctl status bumblebeed
Observe a linha CGroup:Grupo CG: /system.slice/bumblebeed.service
└─809 /usr/sbin/bumblebeedExecute glxgears no bumblebee
primusrun glxgears
Enquanto ainda estiver em execução
glxgears
, verifique novamente se há abelha
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 se esperar, agora existe uma instância do servidor X, gerada pelo bumblebee, que está rodando
glxgears
na placa nvidiaPare
glxgears
e verifique novamente: a instância do X.org desapareceuAgora lance ojogo a vaporatravés
primusrun
primusrun /usr/share/playonlinux/playonlinux --run "Steam" -applaunch 12900
E verifique o status do Bumblebee: De volta à etapa 1, nenhum filho do Xorg. (Certifique-se de estar no jogo quando fizer isso, não apenas no menu)
Eu usei o primusrun porque se o programa não usar a placa gráfica, nenhuma instância do Xorg será gerada, enquanto o optirun de alguma forma força a instanciação do Worg
Cheguei até ao ponto depararo daemon bumblebee para ter certeza de que o jogo ainda estava rodando (NÃO FAÇA ISSO! Se o programa estiver realmente rodando na placa nvidia, isso não apenas congelaria a janela do seu lado, mas também paralisaria a GPU)
As conjecturas
Então, certo, o jogo não roda no Bumblebee; Mas onde está o problema?
Tem que ser porque, em algum lugar, um dos wrappers gera um novo processo e retorna.Tornando o processo alvo inacessível para primusrun. Mas quem é o culpado?
É um dos vários wrappers usados pelo playonlinux? Ou é apenas vapor?
Ou talvez seja ainda mais profundo do que isso:E se o Audiosurf simplesmente não usar opengl?Claro que nãonativamente, mas o wine não traduz chamadas DirectX para chamadas opengl?
Deixando de lado essa hipótese sombria, imaginei que deveria chegar o mais próximo possível do executável antes de chamar primusrun. O ideal é algo como primusrun wine game.exe
.
Então, como faço isso?
Bem, para começar, encontrei o "Comando para executar antes de executar o programa" no "Diversos" aba da janela de configuração do playonlinux, conforme sugerido porestá linha:
Você pode usar esta caixa para prefixar comandos ao atalho. Útil, digamos, no caso de laptops com gráficos Nvidia e Intel, e você precisa usar o prefixo primusrun ou optirun antes de iniciar um jogo específico.
Mas acontece que isso é uma besteira completa
Depois de fuçar um pouco nas fontes do PlayonLinux, encontrei o 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" "$@"
O $HOME/.PlayOnLinux/configurations/pre_shortcut/$NAME
arquivo é onde o campo "Comando para executar antes de executar o programa" é salvo. Como você pode ver, este arquivo é source
d, o que significa que você pode fazer um monte de coisasantesexecutando o programa (essa seria a última linha do exec
comando), mas nãocomovocê está executando isso.
Entãochamar qualquer invólucro como primusrun
nesta caixa seria como bater no ar.
No entanto, seguindo esse exemplo, também descobri que $HOME/.PlayOnLinux/shortcuts/$NAME
contém uma chamada para a POL_Wine
função seguida pelo arquivo .exe real, e isso é o máximo que cheguei na cadeia de wrappers usados pelo POL.
Nota inferior
Sei que divergi muito do tópico ao entrar em detalhes, mas realmente pretendo que esta pergunta inclua qualquer jogo Steam ainda não disponível nativamente no Linux que possa ter os mesmos problemas, então tentarei reformular as perguntas aqui (por favor não responda apenas com "Você poderia fazeressehack para fazê-lo funcionar com o Audiosurf") :
- Por que meu jogo não está rodando na placa nvidia discreta quando usei
primusrun
/optirun
? - O que posso fazer para contornar isso?
Responder1
Posso responder à sua segunda pergunta: O que posso fazer para contornar isso?
O que queremos fazer é executar o Steam através do PlayonLinux com optirun/primusrun como prefixo. Todos os jogos que você executa no Steam também serão iniciados automaticamente assim.
Temos que ir para/usr/share/playonlinux/lib/
Existe um arquivo chamado wine.lib
que iremos editar.
Importante: Crie um backup desse arquivo caso algo quebre.
Dentro do arquivo existe uma função chamada POL_Wine ()
.
Basicamente o que queremos mudar dentro desta função é a forma como o wine é executado toda vez que você inicia um aplicativo através do PlayonLinux.
Portanto, dentro desta função você deve encontrar todas as partes onde o vinho é chamado. Procure wine "$@"
no arquivo com ctrl+F no seu editor de texto favorito. No meu arquivo houve 3 ocorrências de wine "$@"
.
Antes de cada ocorrência, acabei de adicionar primusrun
para que fique parecido com primusrun wine "$@"
. Você pode tentar optirun
ou optirun -b primus
também, mas primusrun
é o que funciona para mim.
Esta é a aparência da seção que editei agora:
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
Salve o arquivo e inicie o PlayonLinux normalmente.
Você pode verificar a qualquer momento se sua placa de vídeo discreta é usada ou não executando o seguinte comando em um terminal:
optirun --status
Quando NÃO é usado, a saída fica assim:
Bumblebee status: Ready (3.2.1). X inactive. Discrete video card is off.
Selecione Steam em seus aplicativos PlayonLinux e execute-o. Quando for iniciado, verifique optirun --status
se o seu cartão discreto está ativado.
Minha saída ficou assim:
Bumblebee status: Ready (3.2.1). X is PID 26685, 1 applications using bumblebeed.
Ótimo! O Steam agora está usando seu cartão discreto!
Agora, vamos tentar lançar um jogo no Steam. Escolha um e inicie-o normalmente (não há necessidade de mexer nas opções de inicialização no Steam).
Verifique novamente com optirun --status
. A saída deve ficar assim:
Bumblebee status: Ready (3.2.1). X is PID 26685, 2 applications using bumblebeed.
Maravilhoso! O jogo que você lançou também está usando seu cartão discreto!
A beleza disso é que funciona com qualquer aplicativo executado no PlayonLinux, não apenas no Steam.
Para reverter as alterações, basta usar o arquivo de backup que você criou ou apenas excluir os prefixos adicionados wine.lib
e salvar o arquivo. Experimente todos os diferentes prefixos que mencionei acima se tiver problemas.