我在这里谈论的是可怕的组合Optirun/Primusrun + PlayonLinux + Steam这使得包装器覆盖包装器覆盖包装器(primus/optirun 调用 playonlinux,它通过一堆包装器脚本调用 wine,后者又调用 steam,最终调用你的游戏可执行文件)
而且,不,它的效果不太好。
就我而言,有问题的游戏是音频冲浪(名字的第一个),尽管我也有兴趣让其他游戏(如《天际》)以同样的方式运行。
事实
我确信游戏能够运行。但nvidia卡上没有。
我做了以下愚蠢的测试:
检查 bumblebee 守护进程的状态
systemctl status bumblebeed
观察 CGroup 行:CGroup:/system.slice/bumblebeed.service
└─809 /usr/sbin/bumblebeed在 bumblebee 上运行 glxgears
primusrun glxgears
仍在运行时
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 卡上运行停下来
glxgears
再次检查:X.org 实例消失了现在启动蒸汽游戏通过
primusrun
primusrun /usr/share/playonlinux/playonlinux --run "Steam" -applaunch 12900
并检查 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
文件是保存“运行程序之前执行的命令”字段的位置。正如你所看到的,这个文件是source
d 的,这意味着你可以做很多事情前运行程序(这将是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 "$@"
.你也可以尝试optirun
,optirun -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
并保存文件。如果遇到问题,请尝试我上面提到的所有不同前缀。