跳转至内容

Bumblebee

来自 ArchWiki
(重定向自 Bbswitch)

来自 Bumblebee 的 FAQ

Bumblebee 旨在使支持 NVIDIA Optimus 的笔记本电脑在 GNU/Linux 系统中正常工作。该功能涉及两个具有不同功耗配置的显卡,以分层方式共享一个单一的帧缓冲。
  • Bumblebee 存在显著的性能问题[1][2]。请参阅 NVIDIA Optimus 以获取替代解决方案。
  • NVIDIA 已在其 Linux 驱动程序中实现了 PRIME,这使得 Bumblebee 和其他替代方案过时。

Bumblebee: Linux 下的 Optimus

Optimus Technology 是一种 混合图形 实现,没有硬件多路复用器。集成 GPU 管理显示,而独立 GPU 管理最苛刻的渲染,并将工作发送到集成 GPU 进行显示。当笔记本电脑使用电池供电时,独立 GPU 会关闭以节省电力并延长电池寿命。它也已成功地与具有 Intel 集成显卡和 NVIDIA 独立显卡的台式机进行了测试。

Bumblebee 是一个由两部分组成的软件实现

  • 在独立显卡上离屏渲染程序,并使用集成显卡显示。此桥接器由 VirtualGL 或 primus (请继续阅读) 提供,并连接到一个为独立显卡启动的 X 服务器。
  • 在不使用时禁用独立显卡 (请参阅 #电源管理 部分)

它试图模仿 Optimus 技术行为;需要时使用独立 GPU 进行渲染,并在不使用时将其关闭。当前版本仅支持按需渲染,自动基于工作负载启动独立显卡程序尚未实现。

安装

在安装 Bumblebee 之前,请检查您的 BIOS 并尽可能激活 Optimus (较旧的笔记本电脑称之为“可切换图形”) (BIOS 不必提供此选项)。如果 BIOS 中没有 "Optimus" 或 "switchable",请确保两个 GPU 都已启用,并且集成显卡 (igfx) 是初始显示 (主显示)。显示器应连接到板载集成显卡,而不是独立显卡。如果之前已禁用集成显卡并安装了独立显卡驱动程序,请确保删除 /etc/X11/xorg.conf/etc/X11/xorg.conf.d 中与独立显卡相关的配置文件。

安装:

为了支持 32 位应用程序,请启用 multilib 仓库并安装

为了使用 Bumblebee,必须将您的常规 *用户* 添加到 bumblebee

# gpasswd -a user bumblebee

另外,请 启用 bumblebeed.service。重新启动您的系统并按照 #用法 操作。

  • bumblebee 包会安装一个内核模块黑名单文件,该文件阻止 nvidia-drm 模块在启动时加载。如果您之后切换到其他解决方案,请记住卸载它。
  • 该包不黑名单 nvidiafb 模块。您可能没有安装它,因为默认内核不包含它。但是,对于其他内核,您也必须明确地黑名单它,否则 optirunprimusrun 将无法运行。请参阅 FS#69018

用法

测试

安装 mesa-utils 并使用 glxgears 测试 Bumblebee 是否与您的 Optimus 系统一起工作

$ optirun glxgears -info

如果失败,请尝试以下命令 (来自 virtualgl)

$ optirun glxspheres64

如果带有动画的窗口出现,则表示 Optimus 和 Bumblebee 正在工作。

注意 如果 glxgears 失败,但 glxspheres64 工作正常,请在所有情况下都用 glxspheres64 替换 glxgears

一般用法

$ optirun [options] application [application-parameters]

例如,使用 Optimus 启动 Windows 应用程序

$ optirun wine application.exe

另一个例子,使用 Optimus 打开 NVIDIA Settings 面板

$ optirun -b none nvidia-settings -c :8
注意 nvdockAUR 的一个修补版本可以在包 nvdock-bumblebeeAUR 中找到。

有关所有可用选项的列表,请参阅 optirun(1)

配置

您可以配置 Bumblebee 的行为以满足您的需求。速度优化、电源管理和其他功能等精细调整可以在 /etc/bumblebee/bumblebee.conf 中进行配置

优化速度

离屏渲染方法的一个缺点是性能。下表提供了带有 NVIDIA GTX 1060 6GB 的 eGPU 设置下 Lenovo ThinkPad T480 使用 unigine-heavenAUR 基准测试 (1920x1080,最高设置,8x AA) 的原始概览

命令 显示 FPS 得分 最低 FPS 最高 FPS
optirun unigine-heaven 内置 20.7 521 6.9 26.6
primusrun unigine-heaven 内置 36.9 930 15.3 44.1
unigine-heaven 内部 Nvidia-xrun 51.3 1293 8.4 95.6
unigine-heaven 外部 Nvidia-xrun 56.1 1414 8.4 111.9

使用 VirtualGL 作为桥接器

Bumblebee 在一个不可见的 X 服务器中使用 VirtualGL 为您的 Optimus NVIDIA 显卡渲染帧,并将它们传输回您可见的 X 服务器。帧将在传输之前被压缩 - 这可以节省带宽并用于 Bumblebee 的加速优化

要为单个应用程序使用另一种压缩方法

$ optirun -c compress-method application

压缩方法会影响 GPU/CPU 使用率的性能。压缩方法主要会加载 CPU。但是,非压缩方法主要会加载 GPU。

压缩方法

  • jpeg
  • rgb
  • yuv

非压缩方法

  • proxy
  • xv

这是使用 ASUS N550JV 笔记本电脑和基准测试应用程序 unigine-heavenAUR 测试的性能表

命令 FPS 得分 最低 FPS 最高 FPS
optirun unigine-heaven 25.0 630 16.4 36.1
optirun -c jpeg unigine-heaven 24.2 610 9.5 36.8
optirun -c rgb unigine-heaven 25.1 632 16.6 35.5
optirun -c yuv unigine-heaven 24.9 626 16.5 35.8
optirun -c proxy unigine-heaven 25.0 629 16.0 36.1
optirun -c xv unigine-heaven 22.9 577 15.4 32.2
注意 使用 jpeg 压缩方法时发生卡顿。

要为所有应用程序使用标准压缩,请在 /etc/bumblebee/bumblebee.conf 中将 VGLTransport 设置为 compress-method

/etc/bumblebee/bumblebee.conf
[...]
[optirun]
VGLTransport=proxy
[...]

您也可以尝试 VirtualGL 读取显卡像素的方式。将 VGL_READBACK 环境变量设置为 pbo 应该可以提高性能。比较以下

PBO 应该更快

VGL_READBACK=pbo optirun glxgears

默认值是 sync

VGL_READBACK=sync optirun glxgears
注意 CPU 频率缩放将直接影响渲染性能。

Primusrun

注意 由于合成会影响性能,不建议在合成 WM 处于活动状态时调用 primus。请参阅 #合成窗口管理器下的 Primus 问题

primusrun (来自 primus) 正在成为默认选择,因为它消耗的功率更少,并且有时比 optirun/virtualgl 提供更好的性能。它可以单独运行,但不能像 optirun 那样接受选项。将 primus 设置为 optirun 的桥接器提供了更大的灵活性。

对于 64 位机器上的 32 位应用程序支持,请安装 lib32-primus (必须启用 multilib)。

您可以单独运行它

$ primusrun glxgears

或者作为 optirun 的桥接器。默认配置将 virtualgl 设置为桥接器。在命令行中覆盖它

$ optirun -b primus glxgears

或者,在 /etc/bumblebee/bumblebee.conf 中设置 Bridge=primus,您就不需要在命令行中指定它了。

提示 如果您想禁用 VSYNC,请参阅 #Primusrun 鼠标延迟 (禁用 VSYNC)。它还可以消除鼠标输入延迟滞后并略微提高性能。

Pvkrun

来自包 primus_vkpvkrunprimusrun 的一个即插即用替代品,它允许运行基于 Vulkan 的应用程序。可以使用来自 vulkan-toolsvulkaninfo 进行快速检查。

$ pvkrun vulkaninfo

电源 management

本文档或章节是合并到 Hybrid graphics#Using bbswitch 的候选。

注意: 本节仅讨论 bbswitch,它不特定于 Bumblebee。(请在 Talk:Bumblebee 中讨论)

电源管理功能的目标是在 NVIDIA 显卡不再被 Bumblebee 使用时将其关闭。如果安装了 bbswitch (适用于 linux) 或 bbswitch-dkms (适用于 linux-lts 或自定义内核),Bumblebee 守护进程启动时将自动检测到它。无需额外配置。但是,bbswitch 仅适用于 Optimus 笔记本电脑,在台式机上不工作。因此,Bumblebee 电源管理不适用于台式机,并且没有理由在台式机上安装 bbswitch。(尽管如此,Bumblebee 的其他功能在某些台式机上确实有效)。

要使用 bbswitch 手动打开或关闭显卡,请写入 /proc/acpi/bbswitch

# echo OFF > /proc/acpi/bbswitch
# echo ON > /proc/acpi/bbswitch

使用 bbswitch 的 NVIDIA 显卡的默认电源状态

bbswitch 的默认行为是保持显卡电源状态不变。bumblebeed 在启动时确实会禁用显卡,因此以下内容仅在您在没有 bumblebeed 的情况下使用 bbswitch 时才需要。

根据您的需求设置 load_stateunload_state 内核模块参数 (请参阅 bbswitch 文档)。

/etc/modprobe.d/bbswitch.conf
options bbswitch load_state=0 unload_state=1

要在系统启动时运行 bbswitch 而不使用 bumblebeed,请不要忘记按照 Kernel module#systemd 中的说明,将 bbswitch 添加到 /etc/modules-load.d

关机时启用 NVIDIA 显卡

在某些笔记本电脑上,如果系统上次关机时显卡处于断电状态,NVIDIA 显卡在启动时可能无法正确初始化。因此,Bumblebee 守护进程在停止守护进程时 (例如关机时) 会开启 GPU (由于 /etc/bumblebee/bumblebee.conf 中的 (默认) 设置 TurnCardOffAtExit=false)。请注意,此设置不会影响守护进程运行时 the power state,因此如果所有 optirunprimusrun 程序都已退出,GPU 仍将断电。

当您手动停止守护进程时,您可能希望在关机时保持显卡通电,同时在关机时将其开启。要实现后者,请添加以下 systemd 服务 (如果使用 bbswitch)

/etc/systemd/system/nvidia-enable.service
[Unit]
Description=Enable NVIDIA card
DefaultDependencies=no

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo ON > /proc/acpi/bbswitch'

[Install]
WantedBy=shutdown.target

然后 启用 nvidia-enable.service 单元。

从挂起状态唤醒后启用 NVIDIA 显卡

Bumblebee 守护进程可能无法在挂起后激活显卡。一个可能的修复方法是将 bbswitch 设置为电源管理的默认方法

/etc/bumblebee/bumblebee.conf
[driver-nvidia]
PMMethod=bbswitch

[driver-nouveau]
PMMethod=bbswitch
注意 此修复似乎仅在重启系统后生效。重新启动 bumblebee 服务是不够的。

如果上述修复无效,请尝试以下命令

# echo 1 > /sys/bus/pci/rescan

要在挂起后自动重新扫描 PCI 总线,请创建一个脚本,如 Power management/Suspend and hibernate#Hooks in /usr/lib/systemd/system-sleep 中所述。

多显示器

连接到 Intel 芯片的输出

如果端口 (DisplayPort/HDMI/VGA) 连接到 Intel 芯片,您可以使用 xorg.conf 设置多个显示器。将它们设置为使用 Intel 显卡,但 Bumblebee 仍可使用 NVIDIA 显卡。以下是一个用于两个相同分辨率为 1080p 的屏幕并使用 HDMI 输出的示例配置。

/etc/X11/xorg.conf
Section "Screen"
    Identifier     "Screen0"
    Device         "intelgpu0"
    Monitor        "Monitor0"
    DefaultDepth    24
    Option         "TwinView" "0"
    SubSection "Display"
        Depth          24
        Modes          "1920x1080_60.00"
    EndSubSection
EndSection

Section "Screen"
    Identifier     "Screen1"
    Device         "intelgpu1"
    Monitor        "Monitor1"
    DefaultDepth   24
    Option         "TwinView" "0"
    SubSection "Display"
        Depth          24
        Modes          "1920x1080_60.00"
    EndSubSection
EndSection

Section "Monitor"
    Identifier     "Monitor0"
    Option         "Enable" "true"
EndSection

Section "Monitor"
    Identifier     "Monitor1"
    Option         "Enable" "true"
EndSection

Section "Device"
    Identifier     "intelgpu0"
    Driver         "intel"
    Option         "UseEvents" "true"
    Option         "AccelMethod" "UXA"
    BusID          "PCI:0:2:0"
EndSection

Section "Device"
    Identifier     "intelgpu1"
    Driver         "intel"
    Option         "UseEvents" "true"
    Option         "AccelMethod" "UXA"
    BusID          "PCI:0:2:0"
EndSection

Section "Device"
    Identifier     "nvidiagpu1"
    Driver         "nvidia"
    BusID          "PCI:0:1:0"
EndSection

您可能需要更改 Intel 和 NVIDIA 显卡的 BusID。

$ lspci -nnd ::03xx
00:02.0 VGA compatible controller [0300]: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller [8086:0126] (rev 09)

BusID 是 0:2:0。请注意,lspci 输出的是十六进制值,而 Xorg 需要十进制值。

连接到 NVIDIA 芯片的输出

在某些笔记本电脑上,数字视频输出 (HDMI 或 DisplayPort) 硬连接到 NVIDIA 芯片。如果您想在这样的系统上同时使用所有显示器,最简单的解决方案是使用 intel-virtual-output,这是 xf86-video-intel 驱动程序集 (从 v2.99 开始) 提供的一个工具。它允许您将现有 X 会话扩展到其他屏幕,利用虚拟输出来处理独立显卡。用法如下

$ intel-virtual-output [OPTION]... [TARGET_DISPLAY]...
-d <source display>  source display
-f                   keep in foreground (do not detach from console and daemonize)
-b                   start bumblebee
-a                   connect to all local displays (e.g. :1, :2, etc)
-S                   disable use of a singleton and launch a fresh intel-virtual-output process
-v                   all verbose output, implies -f
-V <category>        specific verbose output, implies -f
-h                   this help

如果此命令本身无效,您可以尝试使用 optirun 运行它以启用独立显卡并允许它相应地检测输出。这在联想的 Legion Y720 上是必需的。

$ optirun intel-virtual-output

如果在命令行中没有解析到目标显示器,intel-virtual-output 将尝试连接到任何本地显示器。检测到的显示器可以通过任何桌面显示管理器进行管理,例如 xrandr 或 KDE Display。该工具还将启动 bumblebee (可能保留为默认安装)。有关更多信息,请参阅 Bumblebee wiki 页面

在终端中运行时,intel-virtual-output 会将自身守护化,除非使用了 -f 开关。游戏可以通过导出显示器 export DISPLAY=:8 然后使用 optirun game_bin 运行游戏来在外接屏幕上播放,但是,光标和键盘不能完全捕获。使用 export DISPLAY=:0 恢复到标准操作。

如果 intel-virtual-output 未检测到显示器,或者获得了 no VIRTUAL outputs on ":0" 消息,则 创建

/etc/X11/xorg.conf.d/20-intel.conf
Section "Device"
    Identifier     "intelgpu0"
    Driver         "intel"
EndSection

该文件默认存在,并且

/etc/bumblebee/xorg.conf.nvidia
Section "ServerLayout"
    Identifier     "Layout0"
    Option         "AutoAddDevices" "true"
    Option         "AutoAddGPU" "false"
EndSection

Section "Device"
    Identifier     "DiscreteNvidia"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    Option         "ProbeAllGpus" "false"
    Option         "NoLogo" "true"
    Option         "UseEDID" "true"
    Option         "AllowEmptyInitialConfiguration"
#    Option         "UseDisplayDevice" "none"
EndSection

Section "Screen"
    Identifier     "Screen0"
    Device         "DiscreteNvidia"
EndSection

有关更多要尝试的配置,请参阅 [3]。如果笔记本屏幕被拉伸,光标错位,而外接显示器只显示光标,请尝试终止任何正在运行的合成管理器。

如果您不想使用 intel-virtual-output,另一个选择是配置 Bumblebee 使独立 GPU 保持开启状态,并直接配置 X 来使用两个屏幕,因为它将能够检测它们。

作为最后的手段,您可以运行 2 个 X 服务器。第一个将使用 Intel 驱动程序来驱动笔记本屏幕。第二个将通过 optirun 在 NVIDIA 显卡上启动,以显示在外接显示器上。确保在手动使用 optirun 启动您的桌面环境之前禁用任何显示/会话管理器。然后,您可以登录到集成显卡驱动的会话。

禁用屏幕空白

您可以使用 xset 禁用使用 intel-virtual-output 时的屏幕空白,方法是适当地设置 DISPLAY 环境变量 (有关更多信息,请参阅 DPMS)

$ DISPLAY=:8 xset -dpms s off

多个 NVIDIA 显卡或 NVIDIA Optimus

如果您有多个 NVIDIA 显卡 (例如,在使用 eGPU 的同时,笔记本电脑上还有内置的 NVIDIA 显卡) 或 NVIDIA Optimus,您需要对 /etc/bumblebee/xorg.conf.nvidia 进行少量编辑。如果未进行此更改,守护进程可能会默认使用内部 NVIDIA 显卡。

首先,确定外部显卡的 BusID

$ lspci -ndd ::03xx
00:02.0 VGA compatible controller [0300]: Intel Corporation HD Graphics 530 [8086:191b] (rev 06) (prog-if 00 [VGA controller])
01:00.0 3D controller [0302]: NVIDIA Corporation GM107M [GeForce GTX 960M] [10de:139b] (rev ff) (prog-if ff)
0b:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP104 [GeForce GTX 1070] [10de:1b81] (rev a1)

在这种情况下,BusID 是 0b:00.0

现在编辑 /etc/bumblebee/xorg.conf.nvidia 并在 Section "Device" 中添加以下行

/etc/bumblebee/xorg.conf.nvidia
Section "Device"
    ...
    BusID          "PCI:11:00:0"
    Option         "AllowExternalGpus" "true"  # If the GPU is external
    ...
EndSection
注意 请注意,十六进制的 0b 变成了十进制的 11

故障排除

注意 请在 Bumblebee-Project 的 GitHub tracker 上报告 bug,如其 wiki 中所述。

[VGL] ERROR: Could not open display :8

某些 wine 应用程序存在一个已知问题,它们会 fork 并杀死父进程而不进行跟踪 (例如免费的在线游戏 "Runes of Magic")。

这是 VirtualGL 的一个已知问题。从 bumblebee 3.1 开始,只要您已安装它,就可以使用 Primus 作为您的渲染桥接器

$ optirun -b primus wine windows program.exe

如果这不起作用,此问题的替代解决方法是

$ optirun bash
$ optirun wine windows program.exe

如果使用 NVIDIA 驱动程序,此问题的修复方法是编辑 /etc/bumblebee/xorg.conf.nvidia 并将 Option ConnectedMonitor 更改为 CRT-0

Xlib: extension "GLX" missing on display ":0.0"

如果您尝试从 NVIDIA 网站安装 NVIDIA 驱动程序,这将不起作用。

  1. 以类似的方式卸载该驱动程序
    # ./NVIDIA-Linux-*.run --uninstall
  2. 删除 NVIDIA 生成的 Xorg 配置文件
    # rm /etc/X11/xorg.conf
  3. (重新)安装正确的 NVIDIA 驱动程序: 请参阅 #Installation

[ERROR]Cannot access secondary GPU: No devices detected

在某些情况下,运行 optirun 会返回

[ERROR]Cannot access secondary GPU - error: [XORG] (EE) No devices detected.
[ERROR]Aborting because fallback start is disabled.

在这种情况下,您需要将文件 /etc/X11/xorg.conf.d/20-intel.conf 移动到其他地方,重新启动 bumblebeed 守护进程,它应该就可以工作了。如果您确实需要为 Intel 模块更改某些功能,一种解决方法是将 /etc/X11/xorg.conf.d/20-intel.conf 合并到 /etc/X11/xorg.conf 中。

也可能需要注释掉 /etc/X11/xorg.conf.d/10-monitor.conf 中的 driver 行。

如果您正在使用 nouveau 驱动程序,您可以尝试切换到 NVIDIA 驱动程序。

您可能需要在某处定义 NVIDIA 显卡 (例如,文件 /etc/bumblebee/xorg.conf.nvidia),使用正确的 BusID (根据 lspci 输出)

Section "Device"
    Identifier     "nvidiagpu1"
    Driver         "nvidia"
    BusID          "PCI:0:1:0"
EndSection

请注意 lspci 的输出格式是十六进制,而 xorg 中是十进制。所以如果 lspci 的输出是,例如,0a:00.0,那么 BusID 应该是 PCI:10:0:0

NVIDIA(0): Failed to assign any connected display devices to X screen 0

如果控制台输出是

[ERROR]Cannot access secondary GPU - error: [XORG] (EE) NVIDIA(0): Failed to assign any connected display devices to X screen 0
[ERROR]Aborting because fallback start is disabled.

如果 /etc/bumblebee/xorg.conf.nvidia 中的以下行不存在,您可以将其添加到 "Device" 部分

Option "ConnectedMonitor" "DFP"

如果它已经存在,您可以尝试将其更改为

Option "ConnectedMonitor" "CRT"

之后,重新启动 Bumblebee 服务以应用这些更改。

初始化PCI上的NVIDIA GPU失败:1:0:0 (GPU已从总线移除 / RmInitAdapter 失败!)

rcutree.rcu_idle_gp_delay=1 添加到 内核参数引导加载程序 配置中 (另请参阅原始 BBS 帖子 以获取配置示例)。

Failed to initialize the NVIDIA GPU at PCI:1:0:0 (Bumblebee daemon reported: error: [XORG] (EE) NVIDIA(GPU-0))

您可能会遇到一个问题,即从睡眠中恢复后,primusrunoptirun 命令不再工作。有两种方法可以解决此问题 - 重启系统或执行以下命令

# echo 1 > /sys/bus/pci/rescan

然后尝试测试 primusrunoptirun 是否工作。

如果上述命令没有帮助,请尝试查找您的 NVIDIA 显卡的总线 ID

$ lspci -nnd ::03xx
00:02.0 VGA compatible controller [0300]: Intel Corporation Core Processor Integrated Graphics Controller [8086:0042] 
(rev 18)
01:00.0 VGA compatible controller [0300]: nVidia Corporation Device 0df4 [10de:0df4] (rev a1)

例如,上面的命令显示 01:00.0,所以我们使用以下命令与此总线 ID

# echo 1 > /sys/bus/pci/devices/0000:01:00.0/remove
# echo 1 > /sys/bus/pci/rescan

无法加载 GPU 驱动程序

如果控制台输出是

[ERROR]Cannot access secondary GPU - error: Could not load GPU driver

并且如果您尝试加载 nvidia 模块

# modprobe nvidia
modprobe: ERROR: could not insert 'nvidia': Exec format error

这可能是因为 nvidia 驱动程序与 Linux 内核不同步,例如,如果您安装了最新的 NVIDIA 驱动程序但有一段时间没有更新内核。执行完整的系统更新,然后重新启动以加载更新后的内核。

NOUVEAU(0): [drm] 无法设置drm接口版本

建议切换到官方NVIDIA驱动。正如上游的评论所说,nouveau驱动程序在某些显卡和bumblebee上存在一些问题。

[错误]无法访问次GPU - 错误:X未正确启动

/etc/bumblebee/xorg.conf.nvidia中将"AutoAddDevices"选项设置为"true"(参见此处)。

Section "ServerLayout"
    Identifier     "Layout0"
    Option         "AutoAddDevices" "true"
    Option         "AutoAddGPU" "false"
EndSection

/dev/dri/card0: 无法设置DRM接口版本1.4:权限被拒绝

可以通过在/etc/bumblebee/xorg.conf.nvidia中添加以下行来解决此问题(参见此处)。

Section "Screen"
    Identifier     "Default Screen"
    Device         "DiscreteNvidia"
EndSection

错误:ld.so:来自LD_PRELOAD的对象'libdlfaker.so'无法预加载:已忽略

您可能想在64位系统上使用bumblebee启动32位应用程序。请参阅#安装中的“对于32位...”部分。如果问题仍然存在,或者这是64位应用程序,请尝试使用primus bridge

X服务器上的致命IO错误11(资源暂时不可用)

/etc/bumblebee/bumblebee.conf中的KeepUnusedXServerfalse更改为true。您的程序会fork到后台,bumblebee对此一无所知。

视频撕裂

视频撕裂是Bumblebee上一个相当普遍的问题。要解决此问题,您需要启用垂直同步。它应该默认在Intel显卡上启用,但请从Xorg日志中进行验证。要检查NVIDIA是否启用了它,请确保安装了nvidia-settings并运行

$ optirun nvidia-settings -c :8

X Server XVideo Settings -> Sync to VBlankOpenGL Settings -> Sync to VBlank都应启用。Intel显卡通常撕裂较少,因此请将其用于视频播放。特别是,请使用VA-API进行视频解码(例如,使用mplayer-vaapi并带上-vsync参数)。

有关如何在Intel显卡上修复撕裂问题,请参阅Intel graphics#Tearing

如果仍然无法修复,请尝试从桌面环境中禁用合成。也可以尝试禁用三缓冲。

Bumblebee无法连接到套接字

您可能会遇到类似以下内容的情况:

$ optirun glxspheres64

或者(对于32位):

$ optirun glxspheres32
[ 1648.179533] [ERROR]You have no permission to communicate with the Bumblebee daemon. Try adding yourself to the 'bumblebee' group
[ 1648.179628] [ERROR]Could not connect to bumblebee daemon - is it running?

如果您已经在bumblebee组中(groups | grep bumblebee),可以尝试删除套接字/var/run/bumblebeed.socket

此错误的另一个可能原因是您实际上并未在BIOS中启用两个GPU,因此Bumblebee守护程序实际上并未运行。请仔细检查BIOS设置,并确保已启用Intel显卡(集成显卡 - 在BIOS中可能缩写为igfx)或设置为自动,并且它是主GPU。您的显示器应连接到板载集成显卡,而不是独立显卡。

如果您错误地将显示器连接到独立显卡并且禁用了Intel显卡,那么您可能是在首次尝试单独运行NVIDIA后安装了Bumblebee。在这种情况下,请务必删除/etc/X11/xorg.conf/etc/X11/xorg.conf.d/20-nvidia.conf配置文件。如果Xorg在配置文件中被指示使用NVIDIA,X将会失败。

登录后从控制台运行X.org(无根X.org)

请参阅 Xorg#Rootless Xorg

使用Primus导致段错误

在某些情况下,使用primusrun而不是optirun会导致段错误。这是由于代码自动检测更快的上传方法的错误所致,请参阅FS#58933

解决方法是手动设置PRIMUS_UPLOAD 环境变量为1或2,具体取决于哪种在您的设置中更快,从而跳过自动检测。

$ PRIMUS_UPLOAD=1 primusrun ...

Primusrun鼠标延迟(禁用VSYNC)

对于primusrunVSYNC默认启用,这可能导致鼠标输入延迟或性能略有下降。测试禁用VSYNCprimusrun

$ vblank_mode=0 primusrun glxgears

如果您对以上设置满意,请创建一个别名(例如,alias primusrun="vblank_mode=0 primusrun")。

性能比较

启用VSYNC FPS 得分 最低 FPS 最高 FPS
31.5 793 22.3 54.8
31.4 792 18.7 54.2

使用ASUS N550JV笔记本电脑和基准测试应用程序unigine-heavenAUR进行测试。

注意 要在系统范围内禁用垂直同步,请参阅Intel graphics#Disable Vertical Synchronization (VSYNC)

Primus在合成窗口管理器下的问题

由于合成会降低性能,因此不建议在激活合成WM时调用primus。[4]如果您需要在合成下使用primus并遇到闪烁或性能不佳的问题,则同步primus的显示线程与应用程序的渲染线程可能会有所帮助。

$ PRIMUS_SYNC=1 primusrun ...

这使得primus显示上一帧渲染的帧。

从待机恢复后Bumblebee出现问题

在某些系统中,可能会在从待机恢复后加载nvidia模块。一种可能的解决方案是安装acpi_callacpi软件包。

Optirun不起作用,没有调试输出

用户报告说,在某些情况下,即使Bumblebee已正确安装,运行

$ optirun glxgears -info

也完全没有输出,并且glxgears窗口未出现。任何需要3D加速的程序都会崩溃。

$ optirun bash
$ glxgears
Segmentation fault (core dumped)

显然,这是virtualgl某些版本的一个bug。因此,一种解决方法是改用#Primusrun。有关更多信息,请参阅此论坛帖子

内核4.8的电源管理中断

本文档或章节是合并到 Hybrid graphics#Using bbswitch 的候选。

注意:将所有关于bbswitch的信息放在一个地方。(在Talk:Bumblebee中讨论)

如果您拥有较新的笔记本电脑(BIOS日期为2015年或更新),那么Linux 4.8可能会破坏bbswitch(bbswitch issue 140),因为bbswitch不支持新的、推荐的电源管理方法。结果,GPU可能无法开启、无法关闭,甚至更糟。

作为一种变通方法,将pcie_port_pm=off添加到您的Kernel parameters中。

或者,如果您只对节能(可能还有外部显示器的使用)感兴趣,则删除bbswitch并依赖Nouveau运行时电源管理(支持新方法)。

注意 某些工具(如powertop --auto-tune)会自动为PCI设备启用电源管理,这会导致相同的问题[5]。使用相同的变通方法或不要使用一体式电源管理工具。

死锁问题(lspci 挂起)

请参阅NVIDIA Optimus#Lockup issue (lspci hangs),了解影响新款GTX 965M(或类似)笔记本电脑的问题。

独立显卡始终开启和ACPI警告

acpi_osi=Linux添加到您的Kernel parameters中。有关更多信息,请参阅[6][7]

屏幕0已删除,因为没有匹配的配置节

修改配置如下:

/etc/bumblebee/xorg.conf.nvidia
...
Section "ServerLayout"
...
    Screen 0       "nvidia"
...
EndSection
...
Section "Screen"
    Identifier     "nvidia"
    Device         "DiscreteNvidia"
EndSection
...

行为 erratic,不可预测

如果Bumblebee启动/工作方式不稳定,请检查您是否已设置Network configuration#Local network hostname resolution(详情请参见此处)。

独立显卡始终开启且NVIDIA驱动程序无法卸载

确保nvidia-persistenced.service已禁用且当前未运行。它旨在使NVIDIA驱动程序始终运行[8],这阻止了显卡关闭。

当某个应用程序请求EGL时,独立显卡会被静默激活

如果离散卡被某个程序激活(例如,mpv使用其GPU后端),它可能会保持开启状态。问题可能在于libglvnd加载了NVIDIA驱动程序并激活了显卡。

要禁用此功能,请将环境变量__EGL_VENDOR_LIBRARY_FILENAMES(请参阅文档)设置为仅加载mesa配置文件。

__EGL_VENDOR_LIBRARY_FILENAMES="/usr/share/glvnd/egl_vendor.d/50_mesa.json"

nvidia-utils(及其分支)将配置文件安装在/usr/share/glvnd/egl_vendor.d/10_nvidia.json,该文件具有优先级,并导致libglvnd加载NVIDIA驱动程序并启用显卡。

另一个解决方案是避免安装nvidia-utils提供的配置文件。

帧率在固定一段时间后下降到1 FPS

使用NVIDIA 440.36驱动程序时,DPMS设置默认启用,导致在固定一段时间后(例如10分钟)超时,从而使帧率降至1 FPS。为解决此问题,请将以下行添加到/etc/bumblebee/xorg.conf.nvidia的“Device”部分:

Option "HardDPMS" "false"

应用程序无法录制屏幕

使用Bumblebee时,应用程序无法访问屏幕以识别和录制它。例如,在使用obs-studio并激活NVENC时会发生这种情况。要解决此问题,请使用optirun -b none command禁用桥接模式。

参见