如何使用 NVIDIA 解决 Ubuntu 18.04 上的屏幕撕裂问题?

gor*_*rd0 6 nvidia tearing 18.04

Nvidia 驱动程序的答案- 无法检查“强制完整合成管道”会导致我的笔记本电脑无法检测到外部显示器。撤消解决方案将恢复检测第二台显示器的能力。我仍然对任何类型的视频播放感到撕裂。Youtube、视频播放器等。

我正在使用带有 i7-8750H 和 RTX 2070 (nvidia-driver-430) 的 Ubuntu 18.04。

编辑:

的输出inxi

Graphics:  Card-1: Intel Device 3e9b
           Card-2: NVIDIA Device 1f10
           Display Server: x11 (X.Org 1.20.4 )
           drivers: modesetting,nvidia (unloaded: fbdev,vesa,nouveau)
           Resolution: 2560x1440@59.95hz, 1920x1080@144.00hz
           OpenGL: renderer: GeForce RTX 2070/PCIe/SSE2
           version: 4.6.0 NVIDIA 430.26
Run Code Online (Sandbox Code Playgroud)

英伟达设置截图:

英伟达设置

Bea*_*nog 14

2019 年 8 月 9 日更新:

似乎gord0 (OP) 在他们的评论中是正确的。您不需要执行我之前描述的所有步骤(我不会删除它们,以防万一有人发现它们有帮助)来摆脱撕裂。

你需要做的是:

  1. 打开 NVIDIA X 服务器设置。

  2. 转到X 服务器显示配置

  3. 选择所需的屏幕。

  4. 单击高级按钮。

  5. 启用Force Composition PipelineForce Full Composition Pipeline(尝试两者并启用可以提供最佳结果的那个)。

  6. 单击应用按钮。

或者,您可以通过在终端中运行以下命令来启用强制合成管道强制完整合成管道

  • 对于力合成管道

    nvidia-settings --assign CurrentMetaMode="$(xrandr | sed -nr '/(\S+) connected (primary )?([0-9]+x[0-9]+)(\+\S+).*/{ s//\1: \3 \4 { ForceCompositionPipeline = On }, /; H}; ${ g; s/\n//g; s/, $//; p }')"
    
    Run Code Online (Sandbox Code Playgroud)
  • 对于强制完整合成管道

    nvidia-settings --assign CurrentMetaMode="$(xrandr | sed -nr '/(\S+) connected (primary )?([0-9]+x[0-9]+)(\+\S+).*/{ s//\1: \3 \4 { ForceFullCompositionPipeline = On }, /; H}; ${ g; s/\n//g; s/, $//; p }')"
    
    Run Code Online (Sandbox Code Playgroud)

这些命令使用xrandrsed一些正则表达式以适当的格式获取当前监视器设置并将其用作nvidia=settings --assign命令的输入,从而启用所需的设置。

你现在应该没有屏幕撕裂了。

如果更改不是持久的并且在重新启动后被丢弃,您可以执行以下操作:

  1. 根据您的情况,从上面的命令中运行适当的命令,并确保它正常工作,也就是说您的显示器没有屏幕撕裂。

  2. 将以下命令之一(取决于最适合您的命令)添加到您的启动应用程序。

    • 对于力合成管道

      bash -c "sleep 10 && nvidia-settings --assign CurrentMetaMode=\"$(xrandr | sed -nr '/(\S+) connected (primary )?([0-9]+x[0-9]+)(\+\S+).*/{ s//\1: \3 \4 { ForceCompositionPipeline = On }, /; H}; ${ g; s/\n//g; s/, $//; p }')\""
      
      Run Code Online (Sandbox Code Playgroud)
    • 对于强制完整合成管道

      bash -c "sleep 10 && nvidia-settings --assign CurrentMetaMode=\"$(xrandr | sed -nr '/(\S+) connected (primary )?([0-9]+x[0-9]+)(\+\S+).*/{ s//\1: \3 \4 { ForceFullCompositionPipeline = On }, /; H}; ${ g; s/\n//g; s/, $//; p }')\""
      
      Run Code Online (Sandbox Code Playgroud)

    sleep 10命令只是添加了 10 秒的延迟,以确保在运行该nvidia=settings --assign ...命令之前桌面已完全加载。如果您的桌面需要更多时间来完全加载,您可能需要添加更大的延迟。

或者,您可以通过单击NVIDIA X 服务器设置中的保存到 X 配置文件按钮来保存配置


旧答案。如果上述方法对您不起作用,请尝试这些。

您发布的答案中的建议适用于 Ubuntu 16.04。

对于 Ubuntu 18.04 及更高版本,您必须更改options nvidia_387_drm modeset=1options nvidia-drm modeset=1(不再需要 Nvidia 驱动程序版本)。

所以你要做的是:

  1. 在您的/etc/modprobe.d目录中创建一个名为的文件zz-nvidia-modeset.conf

    nano /etc/modprobe.d/zz-nvidia-modeset.conf 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 向其中添加以下几行:

    #enable prime-sync
    options nvidia-drm modeset=1
    
    Run Code Online (Sandbox Code Playgroud)
  3. Ctrl+OCtrl+保存文件X

  4. 从终端运行:

    sudo update-initramfs -u
    
    Run Code Online (Sandbox Code Playgroud)
  5. 重启。

要启用 NVIDIA 适配器,您必须在重新启动后运行:

sudo prime-select nvidia
Run Code Online (Sandbox Code Playgroud)

然后注销并重新登录。

编辑:如果您使用的是 GNOME,则必须使用另一个显示管理器,例如lightdm,因为gdm不允许外部显示器与nomodeset=1.