我最近买了 MSI GP72 7QF (i5-7300HQ + 英伟达 GTX960m),安装 Ubuntu 17.04 后,我遇到了恼人的屏幕撕裂问题。我安装了最新的 Nvidia 驱动程序 (384.59),但还是会撕裂。我猜问题出在 PRIME 同步上。
我该如何修复它?
答案1
我有两台运行 17.04 的混合型笔记本电脑,一台是旧款 ThinkPad,另一台是 P50(2016 年)。这两台都是 Nvidia Optimus 机器,都配有“企业级”Quadro 显卡和适当的硬件多路复用功能,而便宜的笔记本电脑则没有。这使得 Linux 中的 Optimus 问题变得毫无意义,不过,我的 Optimus 还是可以正常工作。
我花了相当多的时间解决这个问题,并且给出了答案。如果你有我的机器的话。
我的笔记本电脑有一个 bios 设置,可以禁用英特尔显卡,只使用 nvidia 卡,它将其描述为离散模式。这需要移动工作站 ThinkPad 所具有的硬件多路复用。在这种模式下,很容易摆脱撕裂。这是解决方案 (1)。但这可能不是一个选择。
如果 Nvidia 控制面板让您选择 nvidia 或 intel,则您处于混合模式。
如果您想使用混合显卡,或者别无选择,那么很容易避免外接显示器上的撕裂,因为它们是由 nvidia 硬件驱动的。撕裂只出现在笔记本电脑面板上,还是出现在外接显示器上?根据我对这两台机器的经验,外接显示器撕裂是通过强制管道组合来修复的。不需要完整的管道。这是解决方案 (2a),但它不会停止笔记本电脑面板上的撕裂。您可以从 nvidia 控制面板或通过命令行将其打开(适用于启动脚本)。请参阅下面的屏幕截图。有一个技巧:您需要选择一个外接显示器,而不是内部面板,然后单击Advanced...
下面的命令行脚本。
但是要停止在 nvidia prime 模式下英特尔面板上的撕裂,您需要 Prime sync。这是最难实现的功能。我在 17.04 上使用 gnome 桌面,但忘记使用 gdm3。继续使用 lightdm 作为显示管理器。gdm3 目前有一个错误,它似乎强制使用 wayland 会话,但不起作用。使用 lightdm,您可以启用 prime sync 以获得无撕裂体验,使用最新的 nvidia 驱动程序(我假设您已经发现它们在 PPA 中)。您需要创建一个新的 modprobe 文件,以现有 nvidia 命名以加载,然后为此重建 initramfs(清除并重新安装 nvidia 驱动程序会产生副作用,但需要更长的时间)。如果您遇到这种情况,我将用完整的说明更新此答案。它现在运行良好,使用最新的驱动程序(大约一周前)。在此之前,它有效,但我们得到了内核恐慌。现在它似乎很稳定。 nvidia 有一个 Linux 驱动程序论坛,其中有一个非常活跃的帖子。因此,让 prime sync 正常工作是解决方案 (2b)
我不确定我的笔记本电脑上 Prime sync 有什么用处;如果使用多显示器(几乎一直使用),我也可以通过使用离散模式来获得我想要的效果,当我想要更长的电池寿命时,我会在混合模式下切换到 prime-select intel。这意味着要进入 BIOS 设置,但更改 prime 模式无论如何都需要重新启动。换句话说,我从来不需要它,但它确实有效(现在)。
如果在英特尔模式下运行混合显卡,则很容易修复笔记本电脑面板上的撕裂问题,因为 nvidia 卡会从图片中消失(字面意思)。因此,Prime sync 无关紧要。当然,在这种情况下不需要外接显示器。在我的笔记本电脑上,我必须使用一个设置来启用无撕裂英特尔;这是一个 xorg 设置。我有一个脚本 prime-select_tim,它在英特尔模式下运行时恢复该设置,在 nvidia 模式下运行时将其删除。这是因为如果此配置仍然处于活动状态,x 将无法在 prime select nvidia 中启动。/usr/share/X11/xorg.conf.d
您说您在尝试使用英特尔配置文件时遇到了麻烦。我发现在混合 Nvidia 模式下运行时,X 对 /usr/share/X11 的内容非常挑剔。如果您不添加任何内容,它就会起作用(这就是为什么我有一个脚本,如果我更改为混合 nvidia 模式,它会隐藏我的 20-intel.conf 文件)。
还要注意,你应该确保安装了 xserver-xorg-video-intel 软件包。软件包描述暗示你不需要它(“如果你的硬件足够新(大约 2007 年或更新),则不建议安装它。”尽管如此,它还是必不可少。
这是解决方案 (3)。注意我不知道在混合 nvidia 模式下将此文件保留在 xorg.conf.d 中是否仍会导致问题,我有一段时间没有测试过。
这是我的 20-intel.conf,用于修复混合英特尔模式下笔记本电脑面板撕裂的问题。它无法修复混合英伟达模式下笔记本电脑面板撕裂的问题(事实上,即使只是把这个文件留在那里也可能导致 X 无法启动)。只有 Prime sync 可以帮到你。
Section "Device"
Identifier "Intel Graphics"
Driver "intel"
Option "TearFree" "true"
EndSection
~
我在使用 xfce 时解决了所有问题,所以我知道它在那里也能正常工作。但是 17.04 中的 gnome 非常好,所以我换了。我没有在 Unity 中测试过。
== 混合 Nvidia 模式 ==
详细说明如何在混合 nvidia 模式下不出现撕裂:在此模式下,nvidia 卡会渲染所有内容。它可以直接写入外部屏幕,因此外部屏幕上的任何撕裂都只是 nvidia 的问题。ForceCompositionPipeline 是我需要的修复程序。
您可以从命令行激活此功能。以下是我所做的。
#!/bin/bash
nvidia-settings --assign CurrentMetaMode="$(nvidia-settings -q CurrentMetaMode -t|tr '\n' ' '|sed -e 's/.*:: \(.*\)/\1\n/g' -e 's/}/, ForceCompositionPipeline = On}/g')" > /dev/null
我不是该代码片段的作者,对我来说太神奇了。您也可以从 Nvidia 控制面板高级版执行此操作,但请确保单击外接显示器的表示。PRIME 面板(即笔记本电脑面板)不显示此设置
如果这不能解决撕裂问题,我也没办法,但这意味着你的问题是 nvidia 驱动程序问题,与 prime 或 prime sync 无关。我使用的是 PPA 的驱动程序 384.59。请参阅http://ubuntuhandbook.org/index.php/2017/02/how-to-install-nvidia-375-39-378-13-via-ppa-in-ubuntu/
要在笔记本电脑面板上绘图,nvidia 卡会写入英特尔卡使用的内存,然后将其显示在屏幕上。这是“Prime”。请确保您已完成此操作,否则笔记本电脑面板上将没有图像。
但 Prime Sync 是下一个级别。要使两张卡同步以避免撕裂,需要 Prime Sync,这是一项非常新的东西,以至于我们在过去几周才看到一个稳定的解决方案。nvidia 驱动程序需要在内核模式设置下运行,而默认情况下它不会这样做。
sudo vi /etc/modprobe.d/zz-nvidia-modeset.conf
并使用此内容:
options nvidia_384_drm modeset=1
这显然假设您有一个 384 驱动程序。
然后 sudo update-initramfs -u
否则新的文本文件将不会有任何效果。我不在乎任何人对 grub2 中的设置有何评价,使用此文本文件对我而言是唯一有效的方法,并且它是 nvidia Prime Sync 线程上可接受的解决方案。
不要使用 gdm3,如果您当前使用 gdm3,请使用 lightdm。希望 gdm3 错误能在 Ubuntu 17.10 之前修复,届时它可能会成为默认的显示管理器 :) 如果您不确定,那么请这样做:
dpkg-reconfigure lightdm
然后重新启动。
tim@raffles:~$ xrandr --properties | grep PRIME
PRIME Synchronization: 1
答案2
接受的答案确实很好,但直到我改变它才对我起作用(我的 Nvidia 驱动程序版本是 390)
options nvidia_390_drm modeset=1
到
options nvidia_drm modeset=1
重启后,屏幕撕裂现象终于消失。
答案3
在 Ubuntu 16.04 下接受答案的警告
我还没有测试过其后果,但接受的答案说要创建文件/etc/modprobe.d/zz-nvidia-modeset.conf
并使用以下内容:
options nvidia_384_drm modeset=1
然而,这与同一目录中现有的文件相矛盾:
$ cat /etc/modprobe.d/nvidia-graphics-drivers.conf
# This file was installed by nvidia-384
# Do not edit this file manually
blacklist nouveau
blacklist lbm-nouveau
blacklist nvidia-current
blacklist nvidia-173
blacklist nvidia-96
blacklist nvidia-current-updates
blacklist nvidia-173-updates
blacklist nvidia-96-updates
blacklist nvidia-384-updates
alias nvidia nvidia_384
alias nvidia-uvm nvidia_384_uvm
alias nvidia-modeset nvidia_384_modeset
alias nvidia-drm nvidia_384_drm
alias nouveau off
alias lbm-nouveau off
options nvidia_384_drm modeset=0
只是您应该注意一些事情……
简短答案
根据 Tim Richardson 的回答,给出一个简短的答案。适用于带有 Skylake 处理器和 nVidia GTX 970M 控制 HDMI 的系统。全新安装 Ubuntu 16.04,不执行答案中的任何其他步骤,只需使用Dash
启动NVIDIA X-Server Settings
:
单击Advanced
按钮使Force Composition Pipeline
选项可用。然后检查并应用更改。
请注意,有一个保存配置文件的选项:
永久修复屏幕撕裂问题的下一步详细介绍如下ArchLinux。 简而言之:
- 搬去
/etc/X11/xorg.conf
/etc/X11/xorg.conf.d/20-nvidia.conf
- 编辑文件并插入 3 行(如下所示)
- 保存文件并重新启动(我必须执行两次并在 Thunderbolt 3 USB-C 上热插拔第三个屏幕。
要添加的 3 行/etc/X11/xorg.conf.d/20-nvidia.conf
:
Option "metamodes" "nvidia-auto-select +0+0 {ForceCompositionPipeline=On, ForceFullCompositionPipeline=On}"
Option "AllowIndirectGLXProtocol" "off"
Option "TripleBuffer" "on"
答案4
在 Linux Mint 19.1 上,这些都不是永久的解决方案。但已经很接近了。所以我制作了一个可执行文件,并将以下内容放入其中:
sleep 20
nvidia-settings --assign CurrentMetaMode="$(nvidia-settings -q CurrentMetaMode -t|tr '\n' ' '|sed -e 's/.*:: \(.*\)/\1\n/g' -e 's/}/, ForceCompositionPipeline = On}/g')" > /dev/null
然后我将这个文件的链接放在启动应用程序中。我把链接放在那里的原因sleep 20
是为了让系统有时间在执行该命令之前完全启动和启动,因为至少对我来说,没有这个命令,sleep 20
它肯定会破坏声音设置。不知道为什么。但等一会儿再执行命令解决了这个问题。希望这对某人有帮助。