Linux 如何增加自定义分辨率设置?

问题陈述

我希望设置屏幕分辨率为 1600 × 900,但系统的分辨率设置(xrandr)里没有这个选项。请问是否有办法增加这个分辨率设置呢?(软、硬件信息见下文)

补充信息

debian 好像有 wiki 来着?

不管了,反正咱 arch 有 wiki 的。
https://wiki.archlinuxcn.org/wiki/Xrandr

多谢!这个方法试过,添加自定义分辨率后直接黑屏死机了,按 Ctrl + Alt + Backspace 重启 Xorg 才恢复。我回去再好好看看文档,或许是之前的操作有疏漏。

Debian也是有Wiki的。
https://wiki.debian.org/FrontPage

也可以上Debian的社区以及论坛了解一些问题。

多谢!现在我怀疑可能是驱动程序的问题。等有空我直接去 Linux Mint 的官方论坛或 IRC 频道问一下吧。

今天又仔细观察了一下,感觉可能是 cvt 命令的计算结果有问题。

输入 xrandr -q,查询到系统内置的分辨率如下:

$ xrandr -q                 
Screen 0: minimum 320 x 200, current 1440 x 900, maximum 16384 x 16384
eDP connected primary 1440x900+0+0 (normal left inverted right x axis y axis) 309mm x 173mm
   1920x1080     60.00 +
   1680x1050     60.00  
   1280x1024     60.00  
   1440x900      60.00* 
   1280x800      60.00  
   1280x720      60.00  
   1024x768      60.00  
   800x600       60.00  
   640x480       60.00  
HDMI-A-0 disconnected (normal left inverted right x axis y axis)

然后按照网上的方法,依次执行命令:

$ cvt 1600 900
# 1600x900 59.95 Hz (CVT 1.44M9) hsync: 55.99 kHz; pclk: 118.25 MHz
Modeline "1600x900_60.00"  118.25  1600 1696 1856 2112  900 903 908 934 -hsync +vsync
$ sudo xrandr --newmode "1600x900_60.00"  118.25  1600 1696 1856 2112  900 903 908 934 -hsync +vsync    
$ sudo xrandr --addmode eDP "1600x900_60.00"

接下来再运行 xrandr -q,可以看到新增加的分辨率,但是刷新率和内置的那些分辨率选项不一样:

$ xrandr -q
Screen 0: minimum 320 x 200, current 1440 x 900, maximum 16384 x 16384
eDP connected primary 1440x900+0+0 (normal left inverted right x axis y axis) 309mm x 173mm
   1920x1080     60.00 +
   1680x1050     60.00  
   1280x1024     60.00  
   1440x900      60.00* 
   1280x800      60.00  
   1280x720      60.00  
   1024x768      60.00  
   800x600       60.00  
   640x480       60.00  
   1600x900_60.00  59.95  
HDMI-A-0 disconnected (normal left inverted right x axis y axis)

接下来,到系统设置里面修改分辨率为新增的 1600x900,电脑就会黑屏,同时键盘上的指示灯也会熄灭。必须按 Ctrl + Alt + Backspace 重启 X。

我猜测,可能是因为 cvt 计算出来的分辨率配置,对应的刷新率是 59.95 Hz,和显示器的参数(60 Hz)不匹配,因此该配置无法生效。

我用 cvt 计算一个已有的分辨率(比如,1440x900),结果的刷新率也不是 60 Hz。应用 cvt 的计算结果后,计算机也会出现黑屏的问题。因此我怀疑问题出在 cvt 上,其计算结果存在问题。

将近两个月过去了,暂时还是没有找到问题的解决方案。

目前我的做法是:屏幕分辨率设置为 1920×1080(因为目前系统能识别的分辨率里面没有其他能和屏幕长宽比匹配的选项了),然后将字体 DPI 从默认的 96 改为 120,这样,画面能填满屏幕,文字又足够大。

但这样做的问题就是,虽然字体放大了,但很多控件没有放大,导致很多软件界面看起来不协调。

目前在用一个治标不治本的方法:

设置分辨率为 1920 × 1080,然后终端执行如下命令:

xrandr --output eDP --scale 0.83

其中,

  • --output 后是当前输出设备的名称,可以先运行 xrandr 命令查看。
  • --scale 0.83 代表缩放倍数为 0.83。
    • 0.83 这个数字是这样得到的:当前分辨率为 1920 × 1080,但我希望使用的分辨率是 1600 × 900,而 900 ÷ 1080 = 5/6 ≈ 0.83。

不过利用上述命令进行的缩放,每次重新登录都会被重置。可以增加一个开机启动项,让系统在用户登录时自动执行上述命令,调整显示缩放。

好像默认会识别分辨率

但我目前的问题就是系统识别不出来。正常的电脑,分辨率选项里面是有 1600x900 这个选项的,但我的电脑就是没有这个选项。

后来查了一些资料,可能是显卡本身有问题,Linux 内核无法正确识别显卡型号,因此缺少某些分辨率选项。

问题解决了,是无意间试出来的,原理暂时没想明白,感觉可能是和 AMD 显卡的 GPU 显示缩放功能有关。具体操作如下,使用 AMD 集显的朋友或许可以参考一下:

1. 终端执行命令 cvt [长像素] [宽像素],计算自定义分辨率的 modeline。

比如,我需要添加分辨率 1600 × 900,则需要执行

cvt 1600 900

然后会看到如下输出:

# 1600x900 59.95 Hz (CVT 1.44M9) hsync: 55.99 kHz; pclk: 118.25 MHz
Modeline "1600x900_60.00"  118.25  1600 1696 1856 2112  900 903 908 934 -hsync +vsync

复制其中的 “1600x900_60.00” 及后面的部分,备用。在本案例中,我们要复制的部分是:

"1600x900_60.00"  118.25  1600 1696 1856 2112  900 903 908 934 -hsync +vsync

2. 编辑 ~/.xprofile,修改用户的显示设置

编辑自己的主文件夹下的 .xprofile,在文件最后加入如下三行:

xrandr --output eDP --set "scaling mode" "Full aspect"
xrandr --newmode "1600x900_60.00"  118.25  1600 1696 1856 2112  900 903 908 934 -hsync +vsync
xrandr --addmode eDP "1600x900_60.00"

这三行的含义分别为:

  • xrandr --output eDP --set "scaling mode" "Full aspect"设置显示器的 GPU 缩放模式为 Full aspect。之前我提到的无法添加自定义分辨率,应该是因为系统默认的 GPU 缩放模式有问题。改成 Full aspect 就没问题了。
  • xrandr --newmode "1600x900_60.00" 118.25 1600 1696 1856 2112 900 903 908 934 -hsync +vsync新建一个自定义分辨率,其中的 "1600x900_60.00",就是第 1 步中我们复制的 cvt 命令的计算结果。
  • xrandr --addmode eDP "1600x900_60.00"将新建的分辨率添加给显示器 eDP,也就是我们目前正在使用的显示器。

当前正在使用的显示器的名称可在终端执行命令 xrandr 来查询。比如,我这边的输出结果是:

Screen 0: minimum 320 x 200, current 1600 x 900, maximum 16384 x 16384
eDP connected primary 1600x900+0+0 (normal left inverted right x axis y axis) 309mm x 173mm
   1920x1080     60.00 +
   1680x1050     60.00  
   1280x1024     60.00  
   1440x900      60.00  
   1280x800      60.00  
   1280x720      60.00  
   1024x768      60.00  
   800x600       60.00  
   640x480       60.00  
   1600x900_60.00  59.95* 
HDMI-A-0 disconnected (normal left inverted right x axis y axis)

第 2 行开头的 eDP 就是当前显示器的名称。

3. 应用分辨率

先注销,再重新登录,让刚刚编辑的 .xprofile 中的设置生效。

然后,打开你的桌面环境的显示设置功能进行调整,或终端执行如下命令:

xrandr --output eDP --mode "1600x900_60.00"

未竟事项

目前,这个方法还存在两个问题:

  1. 只对单个用户生效。这里我只修改了当前用户的主文件夹下的 .xprofile,这些显示设置对其他用户是无效的。
  2. 对 LightDM 不生效。我曾尝试将上述设置写入 /etc/profile,希望这些设置能在系统全局生效。但会造成 LightDM 无法正常启动。

参考资料


另外,本问题也发在了隔壁 “Debian 中文论坛”,那个论坛中也有一些热心的大佬帮忙分析了原因(虽说目前还是没有什么定论),感兴趣的朋友可以前往查看: