Bumblebee で Steam for Windows ゲームを実行するにはどうすればいいですか?

Bumblebee で Steam for Windows ゲームを実行するにはどうすればいいですか?

私がここで話しているのは、恐ろしい組み合わせですOptirun/Primusrun + PlayonLinux + Steamこれにより、ラッパーの上にラッパーが重ねられます (primus/optirun は playonlinux を呼び出し、playonlinux はラッパー スクリプトの束を介して wine を呼び出し、wine は steam を呼び出し、最終的にゲーム実行ファイルを呼び出します)。

そして、いいえ、それはそれほどうまく機能しません。

私の場合、問題のゲームはオーディオサーフ(名前の通り)、他のゲーム (Skyrim など) も同じように動作させることに興味があります。

事実

私が確信しているのは、ゲームが動くということだ。ただし、NVIDIA カードでは動かない。
私は次のような馬鹿げたテストをやった。

  1. bumblebeeデーモンのステータスを確認します。CGroup
    systemctl status bumblebeed
    行に注目してください:

    Cグループ: /system.slice/bumblebeed.service
                  └─809 /usr/sbin/bumblebeed

  2. バンブルビーでglxgearsを実行する
    primusrun glxgears

  3. 走りながらglxgears、もう一度バンブルビーをチェックしてください
    systemctl status bumblebeed

    Cグループ: /system.slice/bumblebeed.service
                  ├─ 809 /usr/sbin/bumblebeed
                  └─3707 Xorg:8 -config /etc/bumblebee/xorg.conf.nvidia -configdir ...

    予想通り、Bumblebeeによって生成されたXサーバーのインスタンスがglxgearsNVIDIAカード上で実行されています。

  4. 停止しglxgearsて再度確認します。X.orgインスタンスは消えています

  5. 今すぐ起動スチームゲームを通してprimusrun
    primusrun /usr/share/playonlinux/playonlinux --run "Steam" -applaunch 12900

  6. そして、Bumblebee のステータスを確認します。ステップ 1 に戻り、Xorg の子はありません。(これを行うときは、メニュー内だけでなく、必ずゲーム内にいるようにしてください)

私はprimusrunを使用しました。なぜなら、プログラムがグラフィックカードを使用しない場合、Xorgインスタンスは生成されないのに対し、optirunは何らかの方法でWorgのインスタンス化を強制するからです。

私はさらに停止ゲームがまだ実行中であることを確認するために、バンブルビーデーモンを実行しました (これは絶対にやめてください。プログラムが実際に NVIDIA カード上で実行されている場合、ウィンドウがフリーズするだけでなく、GPU も停止します)

推測

そうですね、このゲームは Bumblebee では動作しません。しかし、問題はどこにあるのでしょうか?

それは、どこかでラッパーの 1 つが新しいプロセスを生成して戻るからに違いありません。ターゲット プロセスが primusrun に到達できないようにします。しかし、誰が責任を負うのでしょうか?
playonlinux が使用する複数のラッパーの 1 つでしょうか? それとも単に 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ファイルは「プログラムを実行する前に実行するコマンド」フィールドが保存される場所です。ご覧のとおり、このファイルはsourcedであり、さまざまな操作を実行できます。前にプログラムを実行する(これがexecコマンドの最後の行になります)が、としてあなたはそれを実行しています。

それでこの箱のような包装物を呼び出すことはprimusrun空気を叩くようなものです

それでも、さらにその手がかりを追っていくと、$HOME/.PlayOnLinux/shortcuts/$NAME関数の呼び出しPOL_Wineとそれに続く実際の .exe ファイルが含まれていることもわかりました。これが、POL で使用されるラッパーのチェーンについて私が調べたところのほぼすべてです。

ボトムノート

詳細に述べることで話題から大きく逸れていることに気付きましたが、この質問にはLinuxでネイティブに利用できないSteamゲームで同じ問題が発生する可能性のあるものも含めることを本当に意図しているので、ここで質問を再構成してみます(「次のように答えるだけではいけません」と答えないでください)。これAudiosurf で動作させるためのハック):

  • primusrun/を使用したのに、個別の NVIDIA カードでゲームが実行されないのはなぜですかoptirun?
  • これを回避するにはどうすればいいでしょうか?

答え1

2 番目の質問にお答えします。この問題を回避するにはどうすればよいでしょうか?

私たちがやりたいのは、optirun/primusrun をプレフィックスとして、PlayonLinux 経由で Steam を実行することです。Steam 経由で実行するすべてのゲームも、このように自動的に起動されます。

私たちは行かなければなりません/usr/share/playonlinux/lib/

wine.libそこには、編集するファイルがあります。

重要: 万が一何かが壊れた場合に備えて、そのファイルのバックアップを作成してください。

ファイル内には、 という関数がありますPOL_Wine ()

基本的に、この関数内で変更したいのは、PlayonLinux を介してアプリを起動するたびに wine が実行される方法です。

したがって、この関数内で wine が呼び出されるすべての部分を見つける必要があります。wine "$@"お気に入りのテキスト エディターで ctrl+F を使用してファイル内を検索します。私のファイルでは、 が 3 回出現しましたwine "$@"

それぞれの出現の前に、 を追加して、primusrunのように見えるようにしましたprimusrun wine "$@"。 または も試すことができますoptirunoptirun -b primusprimusrun私の場合は がうまくいきます。

私が編集したセクションは現在このようになっています:

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.

PlayonLinux アプリから Steam を選択して実行します。起動したら、optirun --statusディスクリート カードがアクティブ化されているかどうかを確認します。

出力は次のようになりました:

Bumblebee status: Ready (3.2.1). X is PID 26685, 1 applications using bumblebeed.

素晴らしい! Steam は現在、ディスクリート カードを使用しています。

それでは、Steam でゲームを起動してみましょう。ゲームを 1 つ選択して通常どおり起動します (Steam の起動オプションをいじる必要はありません)。

を再度確認してくださいoptirun --status。出力は次のようになります。

Bumblebee status: Ready (3.2.1). X is PID 26685, 2 applications using bumblebeed.

素晴らしい!起動したゲームもディスクリートカードを使用しています!

これの素晴らしい点は、Steam だけでなく、PlayonLinux 経由で実行するあらゆるアプリで動作することです。

変更を元に戻すには、作成したバックアップ ファイルを使用するか、追加したプレフィックスを削除してwine.libファイルを保存します。問題が発生した場合は、上で説明したさまざまなプレフィックスをすべて試してください。

関連情報