Arch Linux+niri+NVIDIA 笔记本游戏性能排查:4K HDR 从约 45 FPS 提升到 75 FPS
本文最后更新于 2026年10月1日 凌晨
最近, 空之轨迹2nd 发售了,我也第一时间在 steam 上购买下载了,开始游玩。我的主力笔记本是 Archlinux 2024款的翼龙15pro 4070版本, 现在用的 niri+dms+wayland.
听说 cachyOS 的 proton 支持走wayland 而不是 Xwayland 了,因此我也装了 proton-cachyos. 进入游戏之后发现游戏支持HDR, 又让 GPT6 帮我找了一个 niri 的分支,自行构建开启了HDR支持。
但是进入游戏之后,帧率很低,尤其我用4k 中画质的话,大约只有45帧,开启HDR会更低。听闻前段时间Linux上能用上 dlss5, 我也尝试了一下,于事无补,而且帧率进一步降低,可能我的显卡太差了(对应的资源也放在我的 openlist了)。
找AI帮我调了一些参数,也没有什么明显效果,所以在 Linux下我就先用着2k高画质玩着,差不多60FPS. 我又想要不回 Windows 得了,结果 windows下4k中画质有60fps, 但是没有HDR了(我的显示器是支持的)。所以我又回Linux了,想着怎么提升一下帧数。
排查过程
下面的排查过程是让 GPT帮我总结的,大致上没问题。
第一阶段有效的调整是:指定 niri 使用 NVIDIA 独显作为主渲染设备。 游戏本身一直运行在独显上,但 niri 原先使用的是另一块 GPU。后续为了解决日常应用占用独显显存、内外屏需要不同合成 GPU 的问题,又编译了配套修改的 niri 和 Smithay,启用 render-on-output-device,让每个输出在连接它的 GPU 上合成。这个最终方案放在文末的后记里。
记录一下 Windows/Linux 对照、排查过程和解决办法,供双显卡笔记本用户参考。
使用环境
- 系统:Arch Linux
- 桌面:niri+DMS;最初使用自行编译的 HDR 分支,后续使用配套修改的 niri 和 Smithay
- niri 版本:这组帧率记录使用
26.04 (641335f);后续检查时已更新为26.04 (1568e42) - 独显:RTX 4070 Laptop,8GB 显存,PCI 地址
0000:01:00.0 - 核显:AMD Radeon 780M,PCI 地址
0000:07:00.0 - NVIDIA 驱动:
615.71.09 - Proton:
proton-cachyos-slr 1:11.0.20260703-1 - 显示器:ASUS PG32UCDM3,通过 HDMI 连接
- 外屏输出:3840×2160,缩放 200%;配置曾请求 240Hz,但实际刷新率需要单独确认
- 内屏:2560×1600,240Hz,缩放 150%,接口连接 AMD 核显
- VRR:配置启用 VRR;没有按测试轮次完整记录其实际状态
配置中的刷新率不等于实际输出模式。 2026 年 9 月 28 日检查时,外屏实际为约 143.988Hz,DMS 的输出配置也设置为这个模式。之后的日志里既出现过成功选中 240Hz,也出现过请求 240Hz 不可用、回退到 60Hz,以及重新选中 144Hz 的记录。因此,不能把下面所有帧率观察都视为在固定 240Hz 输出下完成;当时没有给每一轮结果保存对应的输出模式。
实际模式可以用下面的命令检查;使用 DMS 时,还要核对 include 引入的输出配置:
1 | |
当前配置中的 variable-refresh-rate 表示启用 VRR。按需模式则需要输出配置中的 variable-refresh-rate on-demand=true,并配合窗口规则中的 variable-refresh-rate true,两者不能混为一谈。具体见 niri 的 VRR 配置说明。
这里的 HDR 支持来自自行构建的分支,不能只凭 26.04 这个版本号判断其他构建是否具有相同功能。最终方案使用 sukanka/niri 的 feat/render-on-output-device 分支和配套的 sukanka/smithay 的 fix/multigpu-buffer-sync 分支。下面保留第一阶段测试的提交号,最终方案的构建版本另行记录。
后期 Linux 对照测试主要使用 4K 输出、中画质、DLSS Performance。这里的 4K 指输出分辨率,启用 DLSS 后并非原生 4K 渲染。
最初的疑问:为什么 Windows 能接近 4K 60 FPS,Linux 却不行?
在 Windows 11 下,使用 4K+DLSS Performance,帧率能够勉强达到 60 FPS。
但 Windows 下还有一个 HDR 问题:
- Windows 系统设置中的 HDR 已开启。
- 游戏内 HDR 显示为 Off,而且不能调整。
- Linux 下使用支持 HDR 的 niri 分支后,游戏内 HDR 可以调整。
所以,Windows 的这个结果不能算作“游戏 HDR 开启时的 4K 60 FPS”。当时也没有把两边所有画质选项逐项记录下来,它主要是排查起点,并非严格控制全部变量的跨系统基准测试。
Linux 下做过的帧率对照
早期在 4K、中画质、DLSS Performance,HDR 关闭 的条件下:
| 运行方式 | 实测帧率 |
|---|---|
| XWayland | 约 60 FPS |
| Proton 原生 Wayland | 43–49 FPS |
这让我最初怀疑是 Proton 的原生 Wayland 路径存在明显性能损失,考虑过重新编译 Proton,或者添加环境变量。
之后另一次测试中,原生 Wayland 的表现是:
| HDR 状态 | 实测帧率 |
|---|---|
| 开启 | 约 45 FPS |
| 关闭 | 约 52 FPS 以上 |
这些是不同轮次的观察,因此没有把早期的 43–49 FPS 与后来的 52 FPS 以上当作完全相同条件下的重复测量。
中间排查了哪些方向?
-
显卡功耗与 Dynamic Boost
游戏时经常看到 GPU 只有约 105W,而
nvidia-smi显示上限为 140W,因此怀疑没有释放全部功耗。检查发现:
- Notebook Dynamic Boost 显示 Supported。
nvidia-powerd已启动。- 一次详细采样中,平均功耗达到 139.59W。
- 另一次连续采样虽然只有约 103–104W,但核心频率稳定在 2520MHz,
SW Power Cap为Not Active。
因此,不能因为某段游戏只有 105W,就判断显卡被锁在 115W,或者需要“解锁 140W”。
-
关闭 Wine fullscreen hack
测试了:
1
PROTON_ENABLE_WAYLAND=1 WINE_DISABLE_FULLSCREEN_HACK=1 gamemoderun %command%帧率仍为 43–49 FPS,没有观察到改善。
-
HDR 分支的 scanout-post-blend-encode
单独尝试了:
1
2
3debug {
scanout-post-blend-encode
}添加和移除都没有观察到帧率变化,因此它不是这次解决问题的关键。
真正的线索:niri 使用的渲染设备
检查 niri 日志:
1 | |
原先显示:
1 | |
随后确认 NVIDIA 独显对应的节点:
1 | |
结果是:
1 | |
也就是说,游戏使用 NVIDIA,但 niri 的主渲染设备并不是 NVIDIA。
之前在 nvidia-smi 的进程列表里也能看到 niri,但这不足以证明 niri 把 NVIDIA 作为主渲染设备。这里需要看 niri 启动日志。
第一阶段:让 niri 统一使用独显合成
在自己维护的 ~/.config/niri/config.kdl 中加入:
1 | |
如果已经有 debug 配置块,就把这一项合并进去。
这里使用 PCI 对应的 by-path 路径,避免依赖可能随启动变化的 renderD128、renderD129 编号。其他机器需要先确认自己的独显 PCI 地址,不能直接照抄。
然后注销并重新进入 niri 会话。主渲染设备在启动时选择,仅重新加载配置不够。
重新检查日志,确认变成:
1 | |
Steam 启动参数保持为:
1 | |
这次调整没有重新编译 Proton;前面的 DLSS5 helper 尝试也未观察到改善。
第一阶段修改后的结果
继续使用 4K 输出、中画质、DLSS Performance:
| 原生 Wayland | 修改前,后期测试 | 指定 niri 使用 NVIDIA 后 |
|---|---|---|
| HDR 开启 | 约 45 FPS | 约 75 FPS |
| HDR 关闭 | 约 52 FPS 以上 | 约 80 FPS |
这是此次测试场景中的结果,不代表整个游戏所有场景都能维持同样帧率。不过,已经超过了我最初希望达到的 4K HDR 60 FPS。
这些数字是游戏场景中的帧率观察。本文没有提供完整的帧时间记录、平均 FPS 或 1% low,也没有逐轮列出同一存档位置、采样时长、内外屏启用状态、VSync、限帧和帧生成设置,以及实验性 DLSS5VKLayer 是否仍加载。因此,这里可以说明调整后观察到明显改善,但不能作为严格控制全部变量的基准测试,或据此确定某一段跨卡传输的耗时。
补充确认:HDMI 本来就是独显直出
我还怀疑过 HDMI 是否经过核显,以及换成 Type-C 连接是否能改善性能。
检查外接屏接口:
1 | |
返回路径中的关键部分是:
1 | |
这说明 HDMI 接口本来就属于 NVIDIA 独显。
内屏 eDP 则位于另一块 GPU:
1 | |
所以这次修改改变的是 niri 使用哪块 GPU 渲染,并没有切换笔记本内屏的硬件 MUX。
修复之后,游戏、niri 主渲染设备和 HDMI 输出都落在 NVIDIA 上。没有必要仅为解决这次帧率问题而更换 Type-C 连接。
另一个问题:游戏失去焦点后最小化
游戏失去焦点后还会出现最小化。这需要分别考虑游戏或 Wine Wayland 对失焦的处理,以及合成器是否接受客户端的最小化请求,不能仅凭现象归因于某个 niri 设置。
这次采用的处理包括以下窗口规则:
1 | |
block-minimize 是本文所用分支支持的扩展,不应当作普通上游 niri 的通用配置。相关实现用于忽略客户端的 xdg_toplevel.set_minimized 请求,不会禁止所有最小化操作,也不保证能阻止游戏自身因失焦隐藏窗口。参见 分支实现和相关讨论。
复制窗口规则前,应使用 niri msg windows 确认实际 app-id。这里的 steam_app_4225980 不能仅从 Steam 游戏编号推导,也不能假定不同 Proton 或显示后端都会报告同一个值。修改后可以运行 niri validate 检查当前构建是否接受该规则。
Proton 启动参数还加上了 WAYLANDDRV_FOCUS_LOSS=0。如果保留前文的 GameMode,完整写法是:
1 | |
该失焦变量是本文使用的 Proton-CachyOS 环境中采用的处理办法,不应泛化为所有 Wine/Proton 版本的通用选项。这里也没有分别记录只使用窗口规则、只使用变量时的效果,因此不能断言某一项单独就能解决问题。这个失焦处理与前面切换合成 GPU 的帧率改善分开看待。
后记与最终方案:按输出设备选择合成 GPU
普通应用也可能开始使用独显
第一阶段未启用按输出合成时,render-drm-device 选择的是 niri 统一合成使用的主 GPU,同时也会影响应用从 Wayland 获知的默认渲染设备。切到 NVIDIA 后,部分普通应用也会默认选择独显,与游戏共享显存;它并没有强制所有应用只能用独显。
2026 年 9 月 28 日的一次检查中,游戏未运行,RTX 4070 的显存占用已经约为 2917 MiB / 8188 MiB。nvidia-smi 中能看到这些进程:
| 进程 | 当次显存占用 |
|---|---|
| niri | 487 MiB |
| Zed | 386 MiB |
| Chrome 的 GPU 进程 | 363 MiB |
| 一个 Electron 应用的 GPU 进程 | 282 MiB |
| DMS / Quickshell | 252 MiB |
| Thunderbird | 178 MiB |
| Telegram | 156 MiB |
| Tsukimi | 108 MiB |
| Alacritty | 45 MiB |
这是当时应用使用状态下的一张快照。进程数值不一定能直接加总为显卡总占用,也没有核显合成时的同条件对照,所以不能说“这项调整额外消耗了 2.9 GiB”。但它确实说明,在 8GB 显存的机器上,日常应用的占用值得一起检查。独显承担桌面渲染也可能增加功耗,这次没有测量电池续航变化。
第二阶段:编译支持 render-on-output-device 的 niri 和 Smithay
统一让 NVIDIA 合成,外屏游戏的路径改善了,但内屏也要由 NVIDIA 渲染后交给 AMD 输出。为了同时保留内屏的核显合成和外屏的独显合成,最终从合成器本身入手:编译修改后的 niri 和 Smithay,加入并启用 render-on-output-device。
开启后,niri 优先在驱动该输出的 GPU 上合成;如果输出设备没有可用的 render node,才回退到主 GPU。本机的分工变成:
| 配置方式 | 内屏 eDP-1 的合成 GPU | 外屏 HDMI-A-1 的合成 GPU |
|---|---|---|
| 主设备为 AMD,未启用新参数 | AMD | AMD |
| 主设备为 NVIDIA,未启用新参数 | NVIDIA | NVIDIA |
主设备为 AMD,启用 render-on-output-device |
AMD | NVIDIA |
这样,使用核显的应用在内屏显示、使用独显的游戏在外屏显示时,应用渲染、合成和输出可以各自使用同一块 GPU。即使游戏没有进入 direct scanout、仍需桌面合成,也不必因为统一由核显合成外屏而绕经核显。
这项功能来自自定义分支,需要同时构建配套的 niri 和 Smithay。只在上游 niri 配置中添加同名参数,并不会自动获得这个行为。本次配套修改的源码为:
| 项目 | 仓库与分支 | 对应提交 |
|---|---|---|
| niri | sukanka/niri,feat/render-on-output-device | 1568e42 |
| Smithay | sukanka/smithay,fix/multigpu-buffer-sync | 7b776da |
niri 的 Cargo.toml 使用本地路径 ../smithay 和 ../smithay/smithay-drm-extras 覆盖上游依赖,所以两个源码目录需要并排放置。Arch 上的打包配置也已经改为同时获取上述两个分支。
Smithay 的配套修改解决的是跨 GPU 缓冲区复用时的同步问题:目标 GPU 还在读取旧画面时,源 GPU 不能提前覆盖共享缓冲区。niri 也补充了客户端 DMA-BUF 的读取完成 fence,让客户端在合成器读完之前不会过早复用缓冲区。这些修改关系到画面正确性,不能把整个方案简化成只增加一个选卡参数。
已有的构建和回归测试记录中,AMD 780M → NVIDIA 4070 的双 GPU 缓冲区复用测试在 linear 和 native 两种布局下通过,测试报告的像素错误为 0;Smithay 的同步单元测试也通过。这些属于同步正确性验证,不等同于新方案的游戏帧率或长期稳定性测试。
最终配置与确认方式
最终配置保留 AMD 为主设备,并启用按输出设备合成:
1 | |
两个参数的作用不同:render-drm-device 选择主设备,作为全局默认的 DMA-BUF 反馈设备以及没有可用 render node 的输出的回退设备;render-on-output-device 决定每个输出实际使用哪块 GPU 合成。修改后需要注销并重新进入 niri 会话。
因此,新版本日志中的 using as the render node: "/dev/dri/renderD128" 只说明 AMD 是主设备,不能再据此判断 HDMI 外屏也在 AMD 上合成。还需要检查每个输出的合成设备:
1 | |
实际会话日志中能看到以下关键信息:
1 | |
这才确认了内屏 AMD 合成、外屏 NVIDIA 合成。这里的日志还不能单独证明游戏是否进入 direct scanout。
应用选卡与仍然存在的跨 GPU 路径
render-on-output-device 控制合成器的渲染设备,不会强制所有日常应用永远使用核显,也不会强制应用随着窗口换屏切换 GPU。主设备为 AMD 时,全局默认反馈仍来自 AMD;分支还会给各输出上的窗口发送对应合成 GPU 的 DMA-BUF feedback,应用是否采用这份反馈、是否重新选择设备,取决于客户端实现。
游戏仍需单独确认使用 NVIDIA。需要通过 PRIME 启动时,可以在已有 Steam 启动参数中加入 prime-run,例如保留原生 Wayland、GameMode 和失焦处理的写法:
1 | |
这条命令用于指定游戏的 GPU,不是前面 45→75 FPS 对照中的新增测试条件。
应用和它所在输出使用同一块 GPU 时,可以避免因统一在主 GPU 合成而引入的跨卡显示路径。核显应用移到独显外屏、独显游戏移到核显内屏,或截图、录屏等场景,仍可能需要跨 GPU 访问或传输。因此,最终方案解决的是按输出分配合成工作,而不是消除所有跨 GPU 开销。
全屏满足条件时,仍可以通过 direct scanout 跳过合成;niri 默认启用主平面的直接扫描输出,但全屏并不保证生效。按输出设备合成的收益不要求游戏一定进入 direct scanout。
截至 2026 年 10 月 1 日,本机运行的 niri 已是 26.04 (1568e42),上述配置和每输出设备的会话日志都已确认。前面约 45→75 FPS 的记录对应第一阶段统一使用独显合成;本文还没有补充最终配套版本在同条件下的平均 FPS、1% low 和显存占用对照,不把两阶段结果合并成同一组性能数据。
这次排查得到的结论
主渲染设备日志及调整后的帧率变化表明,niri 的 GPU 选择以及跨 GPU 显示路径是本例值得重点检查的因素,不能简单归因于“Proton 原生 Wayland 性能差”。
没有进行 GPU 跟踪,因此不能精确断言其中发生了几次复制、各自耗时多少;修复后也没有进一步确认外接屏是否进入直接扫描输出。接口属于独显,与合成器成功直接扫描输出,是两件不同的事。
对于双显卡笔记本,尤其是外接显示器接在独显上的情况,如果游戏已经使用独显,Wayland 性能却明显异常,值得同时检查:
- 游戏使用哪块 GPU。
- 合成器在这个输出上使用哪块 GPU;启用按输出合成时,不能只看主设备日志。
- 显示器接口实际属于哪块 GPU。
本例中,调整第二项后,在当时的 HDR 分支、游戏场景和 HDMI 外屏条件下,观察到帧率从约 45 FPS 提升到约 75 FPS。这支持合成器选卡及跨 GPU 显示路径是重要影响因素,但没有进一步测量具体传输开销。
统一由独显合成带来的显存和内屏跨卡问题,推动了后续的代码修改。最终编译了配套的 niri 和 Smithay,保持 AMD 为主设备并启用 render-on-output-device:内屏由 AMD 合成,HDMI 外屏由 NVIDIA 合成,游戏另行指定使用独显。每输出日志已经确认这一分工。
最新使用结果:采用这个最终方案后,RTX 4070 Laptop 在本游戏中使用 4K 输出、高画质,可以达到约 70 FPS。 这是后续实际游玩中的帧率观察,与前面中画质下约 45→75 FPS 的阶段性测试分开记录;最终方案的游戏帧时间与显存收益仍需补充同条件测量。
我也提供了自编译的 niri-hdr 下载,使用上述定制分支的最新提交构建,包含 render-on-output-device 及配套的 Smithay 修改。本文当前核对的 niri 提交为 1568e42;后续下载包更新后,可用 niri --version 确认所安装构建的实际提交。
参考: