NVIDIA 对开源驱动开发的支持之差从 Linus Torvalds 那句著名的“Fuck NVIDIA”就可见一斑——几乎没有提供任何开发文档,开源驱动的开发基本要通过逆向工程进行。因而,想要获得较好的 3D 加速性能、 VDPAU 硬件解码功能、完整的多头显示支持等等,你必须使用 NVIDIA 闭源驱动。不过闭源驱动的一大问题就是文档匮乏、过时,一大堆神奇设置(不少还是隐藏的)让人摸不着头脑,其中一些项目的默认设置还有些问题,可能导致不小的性能损失。所以,在参考 NVIDIA Linux 驱动的官方文档ArchWiki 的基础上,我做了一些实验,摸索出了一些优化项,可以让你的桌面更加流畅(尤其是 GNOME Shell )。

1. 禁用 VBlank Sync (重要!)

HOW:打开 nvidia-settings ,找到“OpenGL Settings”,取消选择“Sync to VBlank”,并且将 nvidia-settings -l 加入 autostart 中( GNOME 在 gnome-session-properties 中设置)。

WHY: VBlank Sync 即所谓的“垂直同步”,即将 OpenGL 的渲染帧率限制到显示器的垂直刷新率,防止某些情况下画面出现撕裂,具体可以自己搜索一下。这个技术听上去很美,可事实上高帧率导致画面撕裂一般只会出现在老旧的显卡驱动、游戏引擎和 CRT 显示器( LCD 的刷新原理与 CRT 略有不同)之下,在当今这一现象已经极少发生,打开这个功能将导致显卡的渲染性能受到极大限制(运行 glxgears ,你会明显观察到你的独立显卡渲染这样简单的几个齿轮居然都只有不到 100FPS UPDATE:glxgears不能代表性能),最典型的表现就是 GNOME Shell 的特效出现明显的卡顿。所以推荐平常不要使用该功能,仅当你在玩 Quake 之类的游戏、遇到画面撕裂现象时再把它开起来。

2. 关闭 NVIDIA Logo

HOW:编辑 /etc/X11/xorg.conf (如果没有该文件,请以 root 权限运行 nvidia-xconfig 生成),在 Section “Device” 下加入一行 Option "NoLogo" "1"

WHY:我相信没有人会喜欢这玩意儿的吧……

3. 使用按需 VBlank 中断(笔记本推荐)

HOW:仍旧编辑 xorg.conf ,在 Device 节中加入 Option "OnDemandVBlankInterrupts" "1"UPDATE 最新的 nvidia-settings 中已经引入了这项设置。

WHY: NVIDIA 驱动默认会对每一次垂直刷新产生一个中断,这将会导致较大的电源消耗(使用 powertop 工具可以清楚地观察到),使用按需中断将会把中断减少到每秒几个的水平。

4. 强制 pixmap 缓存到显存中

HOW:在开机时运行 nvidia-settings -a InitialPixmapPlacement=2 (方法同1)。

WHY: NVIDIA 驱动默认将 pixmap 缓存到系统内存中,而现今独显的显存越来越大,且 Linux 下也很少大量使用显存的情况,所以将 pixmap 放到速度快上许多的显存中将会 2D 绘图的提高性能——这对于 Firefox 之类大量使用 pixmap 的程序将会带来巨大的影响(参看这里)。

*. 可恶的 nvidia-settings

UDPATE:最新版驱动(310.19)所附带的 nvidia-settings 已经解决了下文所说的 bug ,而且对显示器 Gamma 值配置项的写法有了一些小修改。推荐删掉旧的配置文件,重新配置。

===========For version < 310============= 在我自己使用第4项优化时,我想为何不干脆把这个配置写入 .nvidia-settings-rc 中,与第1项优化一并读取呢?于是我就尝试了一下(文件格式还是比较容易懂的,注意要在配置项之前加上“0/”前缀,表示是 X Screen 0 的配置)。结果过了几天当我再打开文件时发现这一行被神奇地删除了。

后来,在用 nvidia-settings 调整 Gamma 值的时候,我意外地发现了原因所在。每次我调完 Gamma 值,关掉设置程序再重新打开时,屏幕就会突然变亮(我的屏幕的 Gamma 偏差很大、明显发白),进去一看发现 Gamma 又被恢复为 1 了。原来 nvidia-settings 在启动时会把某些配置项重置……

上网搜了一下没有发现什么有价值的资料,不过既然是 Linux ,那么最简单直接的方法就是把 .nvidia-settings-rc 的写权限去掉。果然,问题顺利解决……如此一来,只要配置好之后把文件设置为只读,以后就只需在开机时执行nvidia-settings -l读取设置即可。

=========================================

P.S. 经过实验,推荐使用 DM 的 autostart 读取配置(即使用 gnome-session-properties 等进行配置),不要放在 xinitrc 、 xprofile 或是其他的 X 初始化文件中——我观察到这样的做法会导致在用户登陆后配置被重置。