niri 与 NVIDIA 显卡兼容性实战指南:VRAM 占用过高修复、录屏闪烁处理与驱动排查方案
2026/9/11 21:28:33 网站建设 项目流程

niri 与 NVIDIA 显卡兼容性实战指南:VRAM 占用过高修复、录屏闪烁处理与驱动排查方案

【免费下载链接】niriA scrollable-tiling Wayland compositor.项目地址: https://gitcode.com/GitHub_Trending/ni/niri

niri(一个可滚动平铺的 Wayland 合成器)在 NVIDIA 显卡上运行时,会遇到两类典型的驱动兼容性问题:一是 NVIDIA 驱动不释放显存导致 VRAM 占用异常飙升,二是录屏(screencast)时出现画面闪烁。本文以 niri 官方文档(docs/wiki/Nvidia.md)为主体,结合仓库源码与配置文档,系统讲解这两个问题的成因、可落地的修复方案,以及 NVIDIA 平台上其他常见的排查手段,帮助你在 niri 上获得稳定的 NVIDIA 使用体验。

NVIDIA 驱动与 niri 的兼容性现状

niri 是基于 Wayland 协议的滚动平铺合成器,其渲染链路深度依赖 GBM(Generic Buffer Management)与 DRM。NVIDIA 专有驱动在 Wayland 生态中的历史问题较多,主要体现在缓冲区生命周期管理、presentation time 上报、以及混合 GPU 环境下的输出等方面。仓库中 Getting-Started 明确指出:NVIDIA 驱动目前存在因堆复用(heap reuse)怪癖导致的高 VRAM 占用问题,并推荐用户按 Nvidia.md 中的方案手动修复。

NVIDIA GPU 在 niri 上还可能出现其他异常(例如从 TTY 启动时屏幕黑屏),这些问题有时可以修复,前提是你满足两个基本条件:

  1. 驱动与 GPU 足够新:需要支持 GBM 的 NVIDIA 驱动版本。
  2. 开启内核模式设置(KMS):通常需要在内核命令行中添加nvidia-drm.modeset=1,可参考对应发行版及其他 Wayland 合成器的教程来完成配置。

高 VRAM 占用问题:成因与检测

问题现象

当前 NVIDIA 驱动存在一个已知怪癖:驱动没有把释放的显存正确归还给显存池(heap 未将已释放的缓冲区返回给驱动)。这一现象会直接影响 niri 的显存占用:

  • niri 正常的显存用量应该在100 MiB 量级(可使用 nvtop 等工具观测);
  • 如果你看到显存占用接近1 GiB,大概率就是命中了这个问题。

检测方法

使用nvtop查看 niri 进程的 VRAM 占用:

nvtop

在进程列表中按显存占用排序,重点观察niri进程。若数值在 100 MiB 上下属于正常;若持续攀升至接近 1 GiB,则基本可以确认触发了上述驱动缺陷。

高 VRAM 占用问题:驱动应用配置文件修复方案

好消息是,这个问题可以通过为 NVIDIA 驱动配置一个**按进程生效的应用配置文件(application profile)**来缓解,无需改动 niri 本身。原理是为niri进程设置GLVidHeapReuseRatio配置项,让驱动不再尝试复用/囤积已释放的缓冲,从而把显存归还给系统。

第一步:创建配置文件目录

首先创建 NVIDIA 应用配置文件的存放目录(如果不存在的话,按文档说明,通常该目录默认并不存在):

sudo mkdir -p /etc/nvidia/nvidia-application-profiles-rc.d

第二步:写入 JSON 配置文件

将下面的 JSON 内容写入/etc/nvidia/nvidia-application-profiles-rc.d/50-limit-free-buffer-pool-in-wayland-compositors.json

{ "rules": [ { "pattern": { "feature": "procname", "matches": "niri" }, "profile": "Limit Free Buffer Pool On Wayland Compositors" } ], "profiles": [ { "name": "Limit Free Buffer Pool On Wayland Compositors", "settings": [ { "key": "GLVidHeapReuseRatio", "value": 0 } ] } ] }

配置项说明

  • rules:定义匹配规则。feature: "procname"表示按进程名匹配,matches: "niri"指定目标进程为 niri,即该规则只对 niri 生效,不影响其他图形应用。
  • profiles:定义应用配置集。核心设置项为GLVidHeapReuseRatio,将其设为0表示驱动不再保留空闲缓冲区供复用(复用比例降为零),缓冲区释放后直接归还显存池。
  • 文件命名灵活/etc/nvidia/nvidia-application-profiles-rc.d/目录下的文件可以任意命名,甚至不需要扩展名。文档示例中的50-前缀仅用于排序,帮助你在多个配置文件中约定加载顺序。

参数取值的来龙去脉

文档特别注明了一个细节:当前驱动版本使用的修复值是0,而大约一年前 NVIDIA 工程师最初发布该配置时使用的值是1。如果你在别的资料中看到value: 1的写法,说明那是旧版本的方案;按当前仓库文档(docs/wiki/Nvidia.md)的记载,请使用value: 0。该方案源自 NVIDIA egl-wayland 上游 issue(#126 的评论),若 NVIDIA 后续在内置应用配置中为 niri 自动应用该设置,此手动配置即可省略;不过文档同时指出,底层启发式算法得到真正修复的可能性不大,因此这份配置大概率需要长期保留。

第三步:重启 niri 使配置生效

写入配置文件后,重启 niri即可应用改动。之后可再用nvtop观察显存占用是否回落到 100 MiB 量级。

录屏闪烁问题:wait-for-frame-completion-in-pipewire

曾经的临时开关(已移除)

如果你在 NVIDIA 上遇到录屏花屏(glitches)或闪烁(flickering),此前文档给出的方案是在 niri 配置中加入如下调试开关:

debug { wait-for-frame-completion-in-pipewire }

注意:文档中该代码块带有must-fail注解——这是 niri 文档体系的特殊标记,表示该配置项已不再有效、故意写成"必须失败"的示例。仓库中的文档构建钩子 remove-must-fail.py 会在生成站点时移除,must-fail后缀,避免其出现在渲染后的页面上。

为什么现在不再需要它

文档明确标注了该临时方案的有效期限为Until: 25.08(即截至 niri 25.08 版本)。原因是:这个问题已在 niri 内部被彻底修复,因此该调试标志已被移除。如果你当前使用的 niri 版本在 25.08 或更新,请勿再写入此配置——写入也不会生效(这正是must-fail注解的用意)。

源码佐证

从配置解析源码可以印证这一点:在 niri-config/src/debug.rs 的Debug结构体中,仅存在wait_for_frame_completion_before_queueing字段(对应另一个调试项,含义是"在把帧交给 DRM 之前等待每一帧渲染完成",用于诊断同步与性能问题,见 Configuration:-Debug-Options.md),并不存在wait_for_frame_completion_in_pipewire字段,证实该选项确已从配置模型中移除。

其他 NVIDIA 相关的调试与排查手段

除上述两个核心问题外,仓库文档还记录了若干与 NVIDIA 平台相关的调试选项,可在遇到对应症状时按需开启(这些选项属于 Configuration:-Debug-Options.md 所述的调试项,不受配置破坏性变更政策保护,可能随时变动,仅作排查用途):

emulate-zero-presentation-time:模拟未知 presentation time

debug { emulate-zero-presentation-time }

DRM 返回零(未知)presentation time 的现象在 NVIDIA 专有驱动上是真实存在的。开启该标志可模拟这一行为,用于验证 niri 在这些系统上不至于崩溃或产生严重异常。

disable-10bit-output:混合 GPU 黑屏/白屏

debug { disable-10bit-output }

默认情况下 niri 会优先向显示器输出 10-bit 色彩格式(失败再回退 8-bit)。这在部分Intel + NVIDIA 混合 GPU环境(例如笔记本双显卡)下会引发问题:屏幕不亮、只显示白色等。在 Smithay 底层修复之前,可以通过该调试标志禁用 10-bit 输出格式来解决。相关实现同样定义在 niri-config/src/debug.rs 的DebugPart结构中。

wait-for-frame-completion-before-queueing:帧同步诊断

debug { wait-for-frame-completion-before-queueing }

该选项让 niri 在把每一帧交给 DRM 之前等待渲染完全结束,用于诊断特定硬件的同步与性能问题。若 NVIDIA 平台上出现画面撕裂、节奏异常,可临时开启它做交叉验证;作为调试项,它同样不受兼容性政策约束。

小结与排查路线图

在 niri 上使用 NVIDIA 显卡时,按以下顺序排查:

症状首选方案依据
VRAM 占用接近 1 GiB写入/etc/nvidia/nvidia-application-profiles-rc.d/下的应用配置,将GLVidHeapReuseRatio设为0,重启 niridocs/wiki/Nvidia.md
录屏闪烁/花屏无需处理(niri 25.08 起已修复);旧配置项wait-for-frame-completion-in-pipewire已移除docs/wiki/Nvidia.md、niri-config/src/debug.rs
TTY 启动黑屏更新支持 GBM 的驱动;内核命令行加nvidia-drm.modeset=1docs/wiki/Getting-Started.md
混合 GPU 白屏/不亮开启disable-10bit-outputdocs/wiki/Configuration:-Debug-Options.md
怀疑驱动同步异常临时开启wait-for-frame-completion-before-queueing验证docs/wiki/Configuration:-Debug-Options.md

总而言之:高 VRAM 占用通过 NVIDIA 应用配置文件即可根治GLVidHeapReuseRatio = 0),录屏闪烁已在 niri 25.08 原生修复,其余问题则可借助上述调试标志逐一定位。所有配置均写入 niri 配置文件后重启生效,操作路径清晰、可逆性良好。

【免费下载链接】niriA scrollable-tiling Wayland compositor.项目地址: https://gitcode.com/GitHub_Trending/ni/niri

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询