如何在 bumblebee 上運行 steam for windows 遊戲?

如何在 bumblebee 上運行 steam for windows 遊戲?

我在這裡談論的是可怕的組合Optirun/Primusrun + PlayonLinux + Steam這使得包裝器覆蓋包裝器覆蓋包裝器(primus/optirun 調用 playonlinux,它透過一堆包裝器腳本調用 wine,後者又調用 steam,最終調用你的遊戲可執行檔)

而且,不,它的效果不太好。

就我而言,有問題的遊戲是音響衝浪(名字的第一個),儘管我也有興趣讓其他遊戲(如《天際》)以同樣的方式運作。

事實

我確信遊戲能夠運行。但nvidia卡上沒有。
我做了以下愚蠢的測試:

  1. 檢查 bumblebee 守護程式的狀態
    systemctl status bumblebeed
    觀察 CGroup 行:

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

  2. 在 bumblebee 上運行 glxgears
    primusrun glxgears

  3. 仍在運行時glxgears,再次檢查大黃蜂
    systemctl status bumblebeed

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

    正如預期的那樣,現在有一個由 bumblebee 生成的 X 伺服器實例,它glxgears在 nvidia 卡上運行

  4. 停下來glxgears再檢查一次:X.org 實例消失了

  5. 現在啟動蒸氣遊戲透過primusrun
    primusrun /usr/share/playonlinux/playonlinux --run "Steam" -applaunch 12900

  6. 並檢查 Bumblebee 的狀態:回到步驟 1,沒有 Xorg 子項。 (執行此操作時請務必在遊戲中,而不僅僅是在選單中)

我使用 primusrun 是因為如果程式不使用顯示卡,則不會產生 Xorg 實例,而 optirun 會以某種方式強制實例化 Worg

我甚至做到了停止bumblebee 守護程序以確保遊戲仍在運行(不要這樣做!如果程式確實在 nvidia 卡上運行,這不僅會凍結您這邊的窗口,還會導致 GPU 停止運行)

猜想

所以,沒錯,這款遊戲不能在 Bumblebee 上運行;但問題出在哪裡呢?

這一定是因為,在某個地方,其中一個包裝器產生了一個新進程並返回。使 primusrun 無法存取目標進程。但這該怪誰呢?
它是 playonlinux 使用的多個包裝器之一嗎?或只是蒸汽?

或者也許比這更深:如果 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

我可以回答你的第二個問題:我能做些什麼來解決這個問題?

我們想要做的是透過 PlayonLinux 以 optirun/primusrun 作為前綴來運行 Steam。您透過 Steam 運行的所有遊戲也會像這樣自動啟動。

我們必須去/usr/share/playonlinux/lib/

那裡有一個文件,wine.lib我們將對其進行編輯。

重要提示:建立該文件的備份,以防出現問題。

該檔案內有一個名為 的函數POL_Wine ()

基本上,我們想要在這個函數中更改的是每次透過 PlayonLinux 啟動應用程式時 wine 的執行方式。

所以在這個函數中你必須找到所有呼叫 wine 的部分。wine "$@"在您最喜歡的文字編輯器中使用 ctrl+F 在文件中尋找。在我的文件中,出現了 3 次wine "$@".

在每次出現之前,我只是添加了它,primusrun所以它看起來像primusrun wine "$@".你也可以嘗試optirunoptirun -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.

從 PlayonLinux 應用程式中選擇 Steam 並運行它。當它啟動時,檢查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並儲存文件。如果遇到問題,請嘗試我上面提到的所有不同前綴。

相關內容