完全搬运,原文请猛戳
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
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" 。
WHY: NVIDIA
驱动默认会对每一次垂直刷新产生一个中断,这将会导致较大的电源消耗(使用 powertop
工具可以清楚地观察到),使用按需中断将会把中断减少到每秒几个的水平。
4. 强制 pixmap 缓存到显存中
HOW:在开机时运行 nvidia-settings -a InitialPixmapPlacement=2 (方法同1)。
WHY: NVIDIA 驱动默认将
pixmap 缓存到系统内存中,而现今独显的显存越来越大,且 Linux 下也很少大量使用显存的情况,所以将 pixmap
放到速度快上许多的显存中将会 2D 绘图的提高性能——这对于 Firefox 之类大量使用 pixmap
的程序将会带来巨大的影响(参看这里)。
*. 可恶的 nvidia-settings
在我自己使用第4项优化时,我想为何不干脆把这个配置写入 .nvidia-settings-rc中,与第1项优化一并读取呢?于是我就尝试了一下(文件格式还是比较容易懂的,注意要在配置项之前加上“0/”前缀,表示是
X Screen 0 的配置)。结果过了几天当我再打开文件时发现这一行被神奇地删除了。
后来,在用 nvidia-settings 调整
Gamma 值的时候,我意外地发现了原因所在。每次我调完 Gamma 值,关掉设置程序再重新打开时,屏幕就会突然变亮(我的屏幕的
Gamma 偏差很大、明显发白),进去一看发现 Gamma 又被恢复为 1
了。原来 nvidia-settings 在启动时会把某些配置项重置……WTF
上网搜了一下没有发现什么有价值的资料,不过既然是 Linux
,那么最简单直接的方法就是把 .nvidia-settings-rc 的写权限去掉。果然,问题顺利解决……如此一来,只要配置好之后把文件设置为只读,以后就只需在开机时执行nvidia-settings -l读取设置即可。
P.S. 经过实验,推荐使用 DM 的 autostart 读取配置(即使用 gnome-session-properties
等进行配置),不要放在 xinitrc 、 xprofile 或是其他的 X
初始化文件中——我观察到这样的做法会导致在用户登陆后配置被重置。