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

如何解决使用 NVIDIA 的 Ubuntu 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: [email protected], [email protected]
           OpenGL: renderer: GeForce RTX 2070/PCIe/SSE2
           version: 4.6.0 NVIDIA 430.26

nvidia设置的截图:

nvidia 设置

答案1

2019 年 8 月 9 日更新:

看起来gord0(OP)评论。您不需要执行我之前描述的所有步骤(我不会删除它们,只是万一有人觉得它们有用)来消除撕裂。

你要做的就是:

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

  2. X 服务器显示配置

  3. 选择您想要的屏幕。

  4. 点击先进的按钮。

  5. 使能够力量组合管道或者强制完整合成管道(尝试两者并启用可提供最佳效果的那个)。

  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 }')"
    
  • 为了强制完整合成管道

    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 }')"
    

这些命令使用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 }')\""
      
    • 为了强制完整合成管道

      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 }')\""
      

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

或者,您也可以单击保存到 X 配置文件NVIDIA 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 
    
  2. 添加以下几行:

    #enable prime-sync
    options nvidia-drm modeset=1
    
  3. Ctrl按+OCtrl+保存文件X

  4. 从终端运行:

    sudo update-initramfs -u
    
  5. 重启。

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

sudo prime-select nvidia

然后注销并重新登录。

编辑:如果您使用的是 GNOME,则可能必须使用另一个显示管理器,例如lightdm,因为gdm不允许外接显示器一起工作nomodeset=1(我必须在 18.04 上执行此操作,但在 20.04 上不需要)。

  • 要安装lightdm运行:

    sudo apt install lightdm
    
  • 安装lightdm运行后

    sudo dpkg-reconfigure lightdm
    

    并在出现的终端窗口中选择它作为您的显示管理器。

相关内容