每次使用浏览器看 B 站视频时,CPU 占用总是莫名地高, 8 核心的 i7-10875H 开一个视频就到了稳定的 15% 占用,温度也从待机 55 度上升了 10 多度。我的风扇控制比较激进,超过 55 就是中档,65 以上直接全速,所以导致一开视频,风扇就直接拉满,忍受了这个问题很久了,今天决定着手解决下。

首先问题的原因我其实是知道的,在没有开启 GPU 加速的情况下,视频解码只能靠 CPU 软解,所以导致 CPU 负载较大。但长期以来我是不装 Nvidia 驱动的,因为几乎用不到,徒增功耗,还可能增加滚挂的机率。

安装 Nvidia 驱动

详细安装过程可参照 Arch Wiki

https://wiki.archlinux.org/title/NVIDIA_Optimus

1
2
3
sudo pacman -S nvidia-lts nvidia-utils nvidia-settings xorg-server-devel opencl-nvidia libva-utils

yay -S libva-nvidia-driver

注意这里安装的是 lts 的驱动程序,要求系统内核也是 lts 的,即 linux-lts, 否则内核不匹配会无法加载驱动程序

禁用 Nouveau

blacklist-nvidia-nouveau.conf

1
blacklist nouveau

修复画面撕裂

nvidia-drm-nomodeset.conf

1
options nvidia-drm modeset=1
1
sudo mkinitcpio -P

修改 xinitrc 文件

我是使用 startx 启动图形化界面的,直接在 .xinitrc 文件开头加入下面两行命令即可。如果使用的是 lightdm 等也可以加到对应的初始化脚本中去。

1
2
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto

配置检查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
➜  ~ vainfo
vainfo: VA-API version: 1.13 (libva 2.13.0)
vainfo: Driver version: VA-API NVDEC driver
vainfo: Supported profile and entrypoints
VAProfileMPEG2Simple : VAEntrypointVLD
VAProfileMPEG2Main : VAEntrypointVLD
VAProfileVC1Simple : VAEntrypointVLD
VAProfileVC1Main : VAEntrypointVLD
VAProfileVC1Advanced : VAEntrypointVLD
<unknown profile> : VAEntrypointVLD
VAProfileH264Main : VAEntrypointVLD
VAProfileH264High : VAEntrypointVLD
VAProfileH264ConstrainedBaseline: VAEntrypointVLD
VAProfileHEVCMain : VAEntrypointVLD
VAProfileVP8Version0_3 : VAEntrypointVLD
VAProfileVP9Profile0 : VAEntrypointVLD
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
➜  ~ nvidia-smi
Sat Mar 12 22:21:04 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 510.54 Driver Version: 510.54 CUDA Version: 11.6 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA GeForce ... Off | 00000000:01:00.0 Off | N/A |
| N/A 57C P5 23W / N/A | 516MiB / 6144MiB | 1% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 1337 G /usr/lib/Xorg 512MiB |
| 0 N/A N/A 1402 G picom 2MiB |
+-----------------------------------------------------------------------------+

Firefox 设置

about:config 中按照下表设置对应参数的值

Key Value
media.ffmpeg.vaapi.enabled true
media.rdd-ffmpeg.enabled true
media.av1.enabled false
gfx.x11-egl.force-enabled true
widget.dmabuf.force-enabled true

详见 https://github.com/elFarto/nvidia-vaapi-driver/#firefox

设置环境变量

1
2
LIBVA_DRIVER_NAME=nvidia
MOZ_DISABLE_RDD_SANDBOX=1

启动火狐,打开视频观察效果

可以看到 GPU 开始干活了,CPU 回到正常的 3% 占用, 温度也没有超过 60 度,嗯,成功。