
Ich spreche hier von der schrecklichen KombinationOptirun/Primusrun + PlayonLinux + Steamdas führt zu Wrappern über Wrappern über Wrappern (Primus/Optirun ruft Playonlinux auf, das über eine Reihe von Wrapper-Skripten Wine aufruft, das wiederum Steam aufruft, das schließlich die ausführbare Datei Ihres Spiels aufruft)
Und nein, es funktioniert nicht so gut.
In meinem Fall ist das fragliche SpielAudiosurf(der erste Teil seines Namens), obwohl ich auch daran interessiert bin, andere Spiele (wie Skyrim) auf die gleiche Weise zum Laufen zu bringen.
Die Fakten
Ich bin mir sicher, dass das Spiel läuft. Aber nicht auf der Nvidia-Karte.
Ich habe folgenden dummen Test gemacht:
Überprüfen Sie den Status des Bumblebee-Daemons.
systemctl status bumblebeed
Achten Sie auf die CGroup-Zeile:CGroup: /system.slice/bumblebeed.service
└─809 /usr/sbin/bumblebeedFühren Sie glxgears auf Bumblebee aus
primusrun glxgears
Während des Betriebs
glxgears
erneut nach Bumblebee suchen
systemctl status bumblebeed
CGroup: /system.slice/bumblebeed.service
├─ 809 /usr/sbin/bumblebeed
└─3707 Xorg :8 -config /etc/bumblebee/xorg.conf.nvidia -configdir …Wie zu erwarten gibt es jetzt eine Instanz des von Bumblebee gestarteten X-Servers, der
glxgears
auf der Nvidia-Karte läuftStoppen Sie
glxgears
und prüfen Sie noch einmal: Die X.org-Instanz ist wegStarten Sie nun dieSteam-Spieldurch
primusrun
primusrun /usr/share/playonlinux/playonlinux --run "Steam" -applaunch 12900
Und überprüfen Sie den Status von Bumblebee: Zurück zu Schritt 1, kein Xorg-Kind. (Stellen Sie sicher, dass Sie dabei im Spiel sind, nicht nur im Menü)
Ich habe primusrun verwendet, weil, wenn das Programm die Grafikkarte nicht verwendet, keine Xorg-Instanz erzeugt wird, während optirun irgendwie die Instanziierung von Worg erzwingt
Ich ging sogar so weit,stoppender Bumblebee-Daemon, um sicherzustellen, dass das Spiel noch läuft (TUN SIE DAS NICHT! Wenn das Programm wirklich auf der Nvidia-Karte läuft, würde das nicht nur das Fenster auf Ihrer Seite einfrieren, sondern auch die GPU blockieren)
Die Vermutungen
Also, richtig, das Spiel läuft nicht auf Bumblebee; aber wo ist das Problem?
Dies muss daran liegen, dass einer der Wrapper irgendwo einen neuen Prozess erzeugt und zurückkehrt.Der Zielprozess ist für Primusrun unerreichbar. Aber wer ist schuld?
Ist es einer der vielen Wrapper, die Playonlinux verwendet? Oder liegt es nur an Steam?
Oder vielleicht liegt es sogar noch tiefer:Was ist, wenn Audiosurf einfach kein OpenGL verwendet?Natürlich nichtnativ, aber übersetzt Wine nicht DirectX-Aufrufe in OpenGL-Aufrufe?
Diese düstere Hypothese einmal beiseite gelassen, dachte ich, ich sollte so nah wie möglich an die ausführbare Datei herankommen, bevor ich primusrun aufrufe. Im Idealfall wäre so etwas wie primusrun wine game.exe
…
Also, wie mache ich das?
Nun, zunächst einmal fand ich den "Befehl zum Ausführen vor dem Ausführen des Programms" im "Verschiedenes" Registerkarte des Playonlinux-Konfigurationsfensters, wie angedeutet durchdiese Linie:
Sie können dieses Feld verwenden, um der Verknüpfung Befehle voranzustellen. Dies ist beispielsweise bei Laptops mit Nvidia- und Intel-Grafiken praktisch, wenn Sie vor dem Starten eines bestimmten Spiels das Präfix primusrun oder optirun verwenden müssen.
Aber es stellt sich heraus, dass das völliger Schwachsinn ist
Nachdem ich ein wenig in den Quellen von PlayonLinux herumgestöbert hatte, fand ich den Mistkerl:
if [ -e "$HOME/.PlayOnLinux/configurations/pre_shortcut/$NAME" ]; then source "$HOME/.PlayOnLinux/configurations/pre_shortcut/$NAME" fi exec ./playonlinux-bash "$HOME/.PlayOnLinux/shortcuts/$NAME" "$@"
In dieser $HOME/.PlayOnLinux/configurations/pre_shortcut/$NAME
Datei wird das Feld "Befehl zum Ausführen vor dem Ausführen des Programms" gespeichert. Wie Sie sehen, ist diese Datei source
d, was bedeutet, dass Sie eine Menge Dinge tun könnenVorAusführen des Programms (das wäre die letzte Zeile mit dem exec
Befehl), aber nichtalsdu führst es aus.
Alsojede Verpackung wie primusrun
in dieser Box aufzurufen, wäre wie in die Luft zu schlagen.
Als ich dieser Spur jedoch weiter folgte, stellte ich auch fest, dass sie $HOME/.PlayOnLinux/shortcuts/$NAME
einen Aufruf der POL_Wine
Funktion gefolgt von der eigentlichen EXE-Datei enthält, und weiter bin ich in der Kette der von POL verwendeten Wrapper ungefähr vorgedrungen.
Fazit
Mir ist klar, dass ich durch die vielen Details stark vom Thema abgekommen bin, aber ich meine wirklich, dass diese Frage alle Steam-Spiele einschließt, die noch nicht nativ für Linux verfügbar sind und die gleichen Probleme haben könnten. Daher werde ich versuchen, die Fragen hier neu zu formulieren (bitte antworten Sie nicht einfach mit „Das könnten Sie tunDasHack, damit es mit Audiosurf funktioniert"):
- Warum läuft mein Spiel nicht auf der diskreten Nvidia-Karte, wenn ich
primusrun
/ verwendeoptirun
? - Wie kann ich das Problem umgehen?
Antwort1
Ich kann Ihre zweite Frage beantworten: Was kann ich tun, um das Problem zu umgehen?
Wir möchten Steam über PlayonLinux mit optirun/primusrun als Präfix ausführen. Alle Spiele, die Sie über Steam ausführen, werden ebenfalls automatisch auf diese Weise gestartet.
Wir müssen gehen zu/usr/share/playonlinux/lib/
Dort gibt es eine Datei mit dem Namen wine.lib
, die wir bearbeiten werden.
Wichtig: Erstellen Sie für den Fall, dass etwas kaputt geht, eine Sicherungskopie dieser Datei.
In der Datei befindet sich eine Funktion namens POL_Wine ()
.
Grundsätzlich möchten wir mit dieser Funktion die Art und Weise ändern, wie Wine jedes Mal ausgeführt wird, wenn Sie eine App über PlayonLinux starten.
Innerhalb dieser Funktion müssen Sie also alle Teile finden, in denen Wine aufgerufen wird. Suchen Sie wine "$@"
in der Datei mit Strg+F in Ihrem bevorzugten Texteditor danach. In meiner Datei gab es 3 Vorkommen von wine "$@"
.
Vor jedem Vorkommen habe ich einfach hinzugefügt, primusrun
sodass es wie aussieht primusrun wine "$@"
. Sie können auch optirun
oder versuchen optirun -b primus
, aber primusrun
das ist, was bei mir funktioniert.
So sieht der Abschnitt, den ich bearbeitet habe, jetzt aus:
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
Speichern Sie die Datei und starten Sie PlayonLinux wie gewohnt.
Sie können jederzeit überprüfen, ob Ihre separate Grafikkarte verwendet wird oder nicht, indem Sie den folgenden Befehl in einem Terminal ausführen:
optirun --status
Wenn es NICHT verwendet wird, sieht die Ausgabe folgendermaßen aus:
Bumblebee status: Ready (3.2.1). X inactive. Discrete video card is off.
Wählen Sie Steam aus Ihren PlayonLinux-Apps aus und führen Sie es aus. Überprüfen Sie beim Start, optirun --status
ob Ihre separate Karte aktiviert ist.
Meine Ausgabe sah folgendermaßen aus:
Bumblebee status: Ready (3.2.1). X is PID 26685, 1 applications using bumblebeed.
Großartig! Steam verwendet jetzt Ihre diskrete Karte!
Versuchen wir nun, ein Spiel auf Steam zu starten. Wählen Sie eins aus und starten Sie es wie gewohnt (Sie müssen nicht mit den Startoptionen auf Steam herumspielen).
Überprüfen Sie es noch einmal mit optirun --status
. Die Ausgabe sollte wie folgt aussehen:
Bumblebee status: Ready (3.2.1). X is PID 26685, 2 applications using bumblebeed.
Wunderbar! Das Spiel, das Sie gestartet haben, verwendet auch Ihre diskrete Karte!
Das Schöne daran ist, dass es mit jeder App funktioniert, die Sie über PlayonLinux ausführen, nicht nur mit Steam.
Um die Änderungen rückgängig zu machen, verwenden Sie einfach die von Ihnen erstellte Sicherungsdatei oder löschen Sie einfach die hinzugefügten Präfixe wine.lib
und speichern Sie die Datei. Probieren Sie alle oben genannten Präfixe aus, wenn Sie auf Probleme stoßen.