X.org/XFree86 视频时序 HOWTO

Eric Steven Raymond

Thyrsus 企业


    
    

修订历史
修订版 6.62013-09-22修订者:esr
十年后:为 X.org 进行小幅更新。kvideogen 和 xf86setup 已失效,read-edid 有了新的主页。
修订版 6.52003-09-28修订者:esr
许可证更改为 Creative Commons。
修订版 6.42004-10-14修订者:esr
URL 修复。
修订版 6.32003-02-22修订者:esr
URL 修复。
修订版 6.22002-02-03修订者:esr
关于模式行自动生成的细微更正。
修订版 6.12001-10-29修订者:esr
注意 VESA 模式最高为 1920x1440。
修订版 6.02001-08-09修订者:esr
更清晰地解释了 DDC 和 EDID。本 HOWTO 现在基本上已过时。
修订版 5.02000-08-22修订者:esr
第一个 DocBook 版本。

本 HOWTO 实际上已经过时,并且自 2003 年以来就已如此。当前版本的 X 从您的显示器返回的 EDID 信息计算最佳模式行。此外,本文档中的许多约束和警告适用于 CRT,但不再适用于数字平板显示器。

如何在 X.org(最初为它的祖先 XFree86 编写)下为您的显卡/显示器组合编写模式行。X 发行版现在包含用于配置大多数标准组合的良好工具;如果您正在为超高性能显示器或非常不寻常的硬件调整自定义模式行,本文档主要有用。它也可能帮助您使用 xvidtune 来调整与您的显示器不太匹配的标准模式。

版权

根据 Creative Commons 署名许可 2.0 版本条款,允许复制、分发和/或修改本文档。


目录
1. 免责声明
2. 为什么本 HOWTO 已过时
3. 简介
4. 自动计算工具
5. 视频显示器的工作原理
6. 关于您的显示器和适配器的基本知识
6.1. 显示器同步频率
6.2. 显示器的视频带宽
6.3. 显卡的点时钟
6.4. 这些基本统计数据控制什么
7. 解释基本规格
7.1. 关于带宽
7.2. 同步频率和刷新率:
8. 配置系统中的权衡
9. 内存要求
10. 计算帧大小
11. 黑魔法和同步脉冲
11.1. 水平同步:
11.2. 垂直同步:
12. 将所有内容整合在一起
13. 超频您的显示器
14. 使用隔行扫描模式
15. 问题和答案
16. 修复图像问题。
16.1. 图像向左或向右偏移
16.2. 图像向上或向下偏移
16.3. 图像在水平和垂直方向上都太大
16.4. 图像在水平方向上太宽(太窄)
16.5. 图像在垂直方向上太深(太浅)
17. 绘制显示器功能
18. 鸣谢

1. 免责声明

自行承担风险使用本文档中的材料。在超出制造商规格驱动显示器时,可能会损坏您的显示器和您自己。阅读 超频您的显示器 以获取详细的注意事项。因超频显示器而对您或您的显示器造成的任何损坏均由您自行承担。

本 HOWTO 的最新版本可以在 Linux 文档项目 网站上找到。

请将评论、批评和改进建议直接发送至。请不要发送电子邮件恳求为您的特殊显示器问题提供神奇的解决方案,因为这样做只会浪费我的时间并让您感到沮丧——我所了解的关于该主题的一切都已在此处。


2. 为什么本 HOWTO 已过时

在 X.org 中(以及对于现已过时的 XFree86 的 4.0.0 及更高版本),在大多数情况下您不再需要生成模式行。相反,它们在启动时由服务器内部计算,基于您在显示器功能中指定的分辨率,您的 X 服务器通过对显示器的 EDID 查询(以及您的 X 配置文件的 Screen 部分的 Modes 部分,如果您有的话)获得这些功能。

要更改您的屏幕分辨率和颜色深度,只需编辑或创建描述它的 Display 部分。以下是我的笔记本电脑的 X 配置文件中的 Screen 描述示例

Section "Screen"
	Identifier   "Screen0"
        Device       "ATI Rage Mobility"
        Monitor      "Monitor0"
	DefaultDepth	16

	Subsection "Display"
        	Depth       16
                Modes       "1024x768" 
	EndSubsection

EndSection

您通常只需要做的是更改 Modes 条目中的数字。X 将完成其余的工作。如果您指定了一个不可能的分辨率,它将回退到显示器 EDID 数据表明它可以支持的最接近的近似值。

因此,本 HOWTO 剩余部分中的信息仅在以下情况下有用:(a) 您有一个旧的、pre-EDID 显示器,或者 (b) 您的显卡驱动程序不支持查询显示器,或者 (c) 您正在运行非常旧版本的 X(在这种情况下,您应该通过升级来解决您的问题),或者 (d) 您的显示器/显卡组合在 X 预置模式行范围之外运行。


3. 简介

X 服务器允许用户配置他们的视频子系统,从而鼓励最佳利用现有硬件。本文档旨在帮助您学习如何生成自己的时序数字,以最佳方式利用您的显卡和显示器。

我们将介绍一种获得有效结果的方法,然后向您展示如何从该基础开始实验,以开发出符合您口味的设置。

如果您已经有一个几乎有效的模式(特别是,如果预定义的 VESA 模式之一为您提供了稳定的显示,但显示向右或向左偏移,或太小或太大),您可以直接转到关于 修复图像问题 的章节。这将启发您了解如何调整时序数字以实现特定效果。

不要假设您需要完全进入模式调整,仅仅因为您的 X 在安装后第一次出现时显示乱码;可能是大多数出厂模式行都可以,而您只是碰巧默认使用了一个不适合您的硬件的模式。相反,使用 CTRL-ALT-KP+ 循环浏览所有已安装的模式。如果某些模式看起来可以,请尝试注释掉除 640x480 之外的所有模式,并检查该模式是否有效。如果有效,则取消注释其他几个模式,例如 800x600 和 1024x768,频率应在您的显示器可以处理的范围内。


4. 自动计算工具

所有现代显示器都支持 EDID 规范。支持 EDID 的显示器会向您的计算机报告其功能。

所有现代 X 驱动程序模块都支持 DDC,即 VESA 显示数据通道工具。启用 DDC 的显卡模块将要求显示器提供 EDID 功能描述,并根据该数据自行配置。因此,对于任何最新的显示器,您可能根本无需进行任何配置。

如果您的显卡模块恰好未启用 DDC,但您的显示器支持 EDID,您仍然可以使用 read-edid 程序来询问显示器的统计数据并为您计算模式行。请参阅 read-edid 主页

手动模式行生成器位于 此处。您可以下载 Python 脚本或使用提供的 CGI 表单。

X 提供了一个名为 xvidtune 的工具,您可能会发现它对于测试和调整显示器模式非常有用。它首先会发出关于错误可能造成的后果的可怕警告。如果您仔细阅读本文档并了解 xvidtune 框中漂亮数字背后的含义,您将能够有效且自信地使用 xvidtune。

如果您有 xvidtune(1),您将能够动态测试新模式,而无需修改您的 X 配置文件,甚至无需重启您的 X 服务器。否则,X 允许您在 Xconfig 中定义的各种模式之间进行热键切换(有关详细信息,请参阅 X.man)。使用此功能来节省您的麻烦!当您要测试新模式时,给它一个唯一的模式标签,并将其添加到您的热键列表的末尾。保留一个已知良好的模式作为默认回退,以防测试模式不起作用。

在本文档的末尾,我们包含了一个 `modeplot' 脚本,您可以使用它来生成可用模式的模拟图。这对于生成模式行没有直接帮助,但它可以帮助您更好地理解定义它们的相互关系。


5. 视频显示器的工作原理

了解显示器的工作原理对于理解在 Xconfig 文件的各个字段中输入哪些数字至关重要。这些值在 X 服务器控制显示器的最低级别中使用。

显示器从您可以认为是光栅点的序列生成图像。点从左到右排列形成线。线从上到下排列形成图像。当点被显示器内部的电子束击中时,它们会发出光,每种原色各有一束电子束。为了使光束以相等的时间量击中每个点,光束以恒定的模式(称为光栅)扫过显示器。

我们说“您可以认为是点的序列”,因为这些光栅点实际上并不对应于物理荧光点。物理荧光点比光栅点小得多——它们必须如此,否则显示器会受到严重的莫尔条纹效应的影响。光栅点实际上是模拟驱动信号的样本,并且仅由于信号中的峰值和谷值非常有规律且间隔精细,才显示为点网格。

模式从屏幕的左上角开始,横穿屏幕向右成一条直线,略微“向下倾斜”(向下倾斜的斜率太小以至于无法察觉)。然后光束扫回到显示器的左侧,从新的一行开始。新的一行像第一行一样从左到右扫描。重复此模式,直到扫描完显示器上的最后一行。然后,光束从显示器的右下角移动(来回扫描几次)到左上角,然后重新开始该模式。

此方案有一种变体,称为隔行扫描:在这里,在一个半帧期间仅扫描每隔一行,其余的在第二个半帧期间填充。

将光束从显示器的左上角开始称为帧的开始。当光束从显示器的右下角返回到左上角时,帧结束。帧由光束从显示器顶部追踪到底部的所有线组成。

如果电子束在扫描整个帧期间一直处于开启状态,则显示器上的所有点都将被照亮。显示器的边缘周围将没有黑色边框。在显示器的边缘,图像会变得扭曲,因为光束在那里很难控制。为了减少失真,即使光束指向显示器边缘周围的点(如果光束开启),这些点也不会被光束照亮(因为它们已关闭)。显示器的可视区域以这种方式缩小。

另一个需要理解的重要事项是,当没有点在可见区域上绘制时,光束会发生什么。光束本应用于照亮显示器侧边框的时间用于将光束从右边缘扫回到左边缘。光束本应用于照亮显示器顶部和底部边框的时间用于将光束从显示器的右下角移动到左上角。

适配器卡生成信号,使显示器在每个点(根据所需的颜色)打开电子束以生成图像。显卡还通过生成称为水平同步(用于同步)脉冲的信号来控制显示器何时将光束从右侧移回左侧。每个水平扫描线结束时都会发生一个水平同步脉冲。适配器还生成垂直同步脉冲,该脉冲指示显示器将光束移动到显示器的左上角。垂直同步脉冲在每帧结束附近生成。

显示器要求在水平和垂直同步脉冲之前和之后都有短暂的时间段,以便电子束的位置可以稳定下来。如果光束无法稳定,则图像将不稳定。

有关更多信息,请参阅 电视和显示器偏转系统

在后面的章节中,我们将回到这些基本知识,并提供定义、公式和示例来帮助您使用它们。


6. 关于您的显示器和适配器的基本知识

在修改 Xconfig 条目之前,您需要了解一些基本知识。这些是


6.1. 显示器同步频率

水平同步频率只是显示器每秒可以写入水平扫描线的次数;它是关于您的显示器的最重要的统计数据。垂直同步频率是显示器每秒可以垂直遍历其光束的次数。

同步频率通常列在您的显示器手册的规格页上。垂直同步频率数字通常以 Hz(赫兹)为单位校准,水平同步频率数字以 KHz(千赫兹)为单位校准。通常的范围是垂直 50 到 150Hz,水平 31 到 135KHz。

如果您有 multisync 显示器,这些频率将以范围的形式给出。一些显示器,尤其是低端显示器,具有多个固定频率。这些也可以配置,但您的选项将受到内置显示器特性的严重限制。选择最高的频率对以获得最佳分辨率。并注意——尝试以高于固定频率显示器设计速度的时钟频率驱动它很容易损坏它。

本指南的早期版本对超频 multisync 显示器相当随意,为了获得更好的性能,将其推高到标称最高垂直同步频率以上。此后,我们被指出了更多关于这方面的谨慎理由;我们将在下面的 超频您的显示器 中介绍这些内容。


6.2. 显示器的视频带宽

您的显示器的视频带宽应包含在手册的规格页上。如果没有,请查看显示器的最高额定分辨率。根据经验,以下是如何将这些转换为带宽估计值(从而转换为您可以使用的点时钟的粗略上限)

	640x480			25
	800x600			36
	1024x768		65
	1024x768 interlaced	45
	1280x1024		110
	1600x1200		185

顺便说一句,这张表没有什么神奇之处;这些数字只是标准 X 模式数据库中每个分辨率的最低点时钟(最后一个除外,我推断出来的)。您的显示器的带宽实际上可能高于其最高分辨率所需的最小值,因此不要害怕尝试高出几 MHz 的点时钟。

另请注意,对于 65MHz 左右或以下的点时钟,带宽很少成为问题。使用 SVGA 显卡和大多数高分辨率显示器,您无法接近显示器视频带宽的限制。以下是一些示例

	Brand				Video Bandwidth
	----------			---------------
	NEC 4D				75Mhz
	Nano 907a			50Mhz
	Nano 9080i			60Mhz
	Mitsubishi HL6615		110Mhz
	Mitsubishi Diamond Scan		100Mhz
	IDEK MF-5117			65Mhz
	IOCOMM Thinksync-17 CM-7126	136Mhz
	HP D1188A			100Mhz
	Philips SC-17AS			110Mhz
	Swan SW617			85Mhz
	Viewsonic 21PS			185Mhz
	PanaSync/Pro P21		220Mhz

即使是低端显示器,通常也不会因其额定分辨率而受到带宽的严重限制。NEC Multisync II 就是一个很好的例子——它甚至无法按照其规格显示 800x600。它只能显示 800x560。对于如此低的分辨率,您不需要高点时钟或大量带宽;您可能能做的最好的事情是 32Mhz 或 36Mhz,它们都离显示器的额定视频带宽 30Mhz 不太远。

在这两个驱动频率下,您的屏幕图像可能不如应有的清晰,但绝对是可接受的质量。当然,如果 NEC Multisync II 的视频带宽高于 36Mhz 就更好了。但这对于文本编辑等常见任务来说并不重要,只要差异不至于引起严重的图像失真(如果真是这样,您的眼睛会立即告诉您)。


6.3. 显卡的点时钟

您的视频适配器手册的规格页通常会给出显卡的最大点时钟(即,它每秒可以写入屏幕的总像素数)。

如果您没有此信息,X 服务器将为您获取它。最新版本的 X 服务器都支持 --probeonly 选项,该选项会打印出此信息并退出,而无需实际启动 X 或更改视频模式。

如果您没有 -probeonly,请不要灰心。即使您的 X 锁定您的显示器,它也会向标准错误输出一行时钟和其他信息。如果您将此重定向到一个文件,即使您必须重新启动以恢复您的控制台,它也应该被保存。

探测结果或启动消息应类似于以下示例之一

如果您使用的是 X.org 或 XFree86

Xconfig: /usr/X11R6/lib/X11/Xconfig
(**) stands for supplied, (--) stands for probed/default values
(**) Mouse: type: MouseMan, device: /dev/ttyS1, baudrate: 9600
Warning: The directory "/usr/andrew/X11fonts" does not exist.
         Entry deleted from font path.
(**) FontPath set to "/usr/lib/X11/fonts/misc/,/usr/lib/X11/fonts/75dpi/"
(--) S3: card type: 386/486 localbus
(--) S3: chipset:   924
                    ---
    Chipset -- this is the exact chip type; an early mask of the 86C911

(--) S3: chipset driver: s3_generic
(--) S3: videoram:  1024k
                    -----
         Size of on-board frame-buffer RAM

(**) S3: clocks:  25.00  28.00  40.00   3.00  50.00  77.00  36.00  45.00
(**) S3: clocks:   0.00   0.00  79.00  31.00  94.00  65.00  75.00  71.00
                  ------------------------------------------------------
                              Possible driving frequencies in MHz

(--) S3: Maximum allowed dot-clock: 110MHz
                                    ------
                                   Bandwidth
(**) S3: Mode "1024x768": mode clock =  79.000, clock used =  79.000
(--) S3: Virtual resolution set to 1024x768
(--) S3: Using a banksize of 64k, line width of 1024
(--) S3: Pixmap cache:
(--) S3: Using 2 128-pixel 4 64-pixel and 8 32-pixel slots
(--) S3: Using 8 pages of 768x255 for font caching

如果您使用的是 SGCS 或 X/Inside X

WGA: 86C911 (mem: 1024k clocks: 25 28 40 3 50 77 36 45 0 0 79 31 94 65 75 71)
---  ------       -----         --------------------------------------------
 |     |            |                 Possible driving frequencies in MHz
 |     |            +-- Size of on-board frame-buffer RAM
 |     +-- Chip type
 +-- Server type

注意:尽可能在您的机器卸载负载的情况下执行此操作(如果可能的话)。因为 X 是一个应用程序,它的时序循环可能会与磁盘活动冲突,从而导致上面的数字不准确。多次执行此操作并观察数字是否稳定;如果它们不稳定,请开始终止进程,直到它们稳定为止。您的鼠标守护进程(如果您有)尤其容易让您绊倒(Linux 用户为 gpm,SVr4 用户为 mousemgr)。

为了避免时钟探测不准确,您应该剪切出时钟时序并将它们作为 Clocks 属性的值放入您的 Xconfig 中——这会抑制时序循环,并为 X 提供它可以尝试的精确时钟值列表。使用上面示例中的数据

wga
	Clocks	25 28 40 3 50 77 36 45 0 0 79 31 94 65 75 71

在负载高度可变的系统上,这可能有助于您避免神秘的 X 启动失败。X 有可能启动,由于系统负载而使其时序错误,然后无法在其配置数据库中找到匹配的点时钟——或者找到错误的点时钟!


6.4. 这些基本统计数据控制什么

您的显示器的同步频率范围以及您的视频适配器的点时钟决定了您可以使用的最终分辨率。但这取决于驱动程序来挖掘您的硬件的潜力。没有同样称职的设备驱动程序的卓越硬件组合是浪费金钱。另一方面,使用通用的设备驱动程序但功能较弱的硬件,您可以将硬件稍微推高到其额定性能之上。这是 X 的设计理念。

您应该将您使用的点时钟与显示器的视频带宽相匹配。这里有很多余地——一些显示器可以超出其标称带宽 30% 之多。这里的风险与超出显示器的额定垂直同步频率有关;我们将在下面详细讨论它们。

了解带宽将使您能够在可能的配置之间做出更明智的选择。它可能会影响您的显示器的视觉质量(尤其是精细细节的清晰度)。


7. 解释基本规格

本节解释上述规格的含义,以及您需要了解的其他一些内容。首先,是一些定义。括号中的每个定义都是我们在进行计算时将使用的变量名

水平同步频率 (HSF)

每秒水平扫描次数(见上文)。

垂直同步频率 (VSF)

每秒垂直扫描次数(见上文)。主要作为刷新率的上限很重要。

点时钟 (DCF)

更正式地说,`驱动时钟频率';适配器上的晶体或 VCO 的频率——它可以发射的最大每秒点数。

视频带宽 (VB)

您可以馈送到显示器视频输入并仍然期望看到任何可辨别内容的最高频率。如果您的适配器产生交替的开/关模式(如在隔行扫描模式下),其最低频率是 DCF 的一半,因此理论上带宽从 DCF/2 开始才有意义。但是,为了清晰地显示视频图像中的精细细节,您不希望它远低于您的最高 DCF,最好更高。

帧长度 (HFL, VFL)

水平帧长度 (HFL) 是您的显示器的电子枪扫描一条水平线所需的点时钟滴答数,包括不活动的左右边框。垂直帧长度 (VFL) 是整个图像中的扫描线数,包括不活动的顶部和底部边框。

屏幕刷新率 (RR)

您的屏幕每秒重绘的次数(这也称为“帧速率”)。频率越高越好,因为它们减少闪烁。60Hz 良好,VESA 标准 72Hz 更好。将其计算为

	RR = DCF / (HFL * VFL)

请注意,分母中的乘积与显示器的可见分辨率相同,但通常稍大一些。我们将在下面详细介绍。

隔行扫描模式通常指定的速率(如 87Hz 隔行扫描)实际上是半帧速率:对于典型的显示器,整个屏幕似乎具有大约该闪烁频率,但每条线仅以一半的频率刷新。

出于计算目的,我们将隔行扫描显示器按其全帧(刷新)率计算,即 43.5Hz。隔行扫描模式的质量优于具有相同全帧率的非隔行扫描模式,但肯定比对应于半帧率的非隔行扫描模式差。


7.1. 关于带宽

显示器制造商喜欢宣传高带宽,因为它限制了屏幕上强度和颜色变化的清晰度。高带宽意味着更小的可见细节。

您的显示器使用电子信号向您的眼睛呈现图像。一旦这些信号从数字化形式转换为模拟形式,它们总是以波形形式出现。它们可以被认为是许多更简单的波形的组合,每个波形都有一个固定的频率,其中许多波形的频率范围在 Mhz 范围内,例如 20Mhz、40Mhz 甚至 70Mhz。您的显示器视频带宽实际上是它可以处理而不会失真的最高频率模拟信号。

对于我们的目的,视频带宽主要作为您可以使用的最高点时钟的近似截止点非常重要。


7.2. 同步频率和刷新率

显示器上的每条水平扫描线只是帧长度扫描的可见部分。在任何时刻,屏幕上实际上只有一个点处于活动状态,但凭借足够快的刷新率,您眼睛的视觉暂留使您能够“看到”整个图像。

这里有一些图片可以帮助您理解

     _______________________
    |                       |     The horizontal sync frequency
    |->->->->->->->->->->-> |     is the number of times per
    |                      )|     second that the monitor's
    |<-----<-----<-----<--- |     electron beam can trace
    |                       |     a pattern like this
    |                       |
    |                       |
    |                       |
    |_______________________|    
     _______________________
    |        ^              |     The vertical sync frequency
    |       ^ |             |     is the number of times per
    |       | v             |     second that the monitor's
    |       ^ |             |     electron beam can trace
    |       | |             |     a pattern like this
    |       ^ |             |
    |       | v             |
    |       ^ |             |
    |_______|_v_____________|    

请记住,实际的光栅扫描是非常紧密的之字形图案;也就是说,光束左右移动,同时上下移动。

现在我们可以看到点时钟和帧大小如何与刷新率相关。根据定义,一赫兹 (hz) 是一秒钟一个周期。因此,如果您的水平帧长度为 HFL,垂直帧长度为 VFL,那么覆盖整个屏幕需要 (HFL * VFL) 个滴答。由于根据定义,您的显卡每秒发出 DCF 个滴答,那么显然您的显示器的电子枪每秒可以从左到右和从下到上扫描屏幕 DCF / (HFL * VFL) 次/秒。这就是您的屏幕刷新率,因为它表示您的屏幕每秒可以更新(因此刷新)多少次!

您需要理解这个概念才能设计一个配置,该配置以适合您需求的方式权衡分辨率和闪烁。

对于那些视觉效果优于文本的人,这里有一个

        RR                                      VB
         |   min HSF                     max HSF |
         |    |             R1        R2  |      |
max VSF -+----|------------/----------/---|------+----- max VSF
         |    |:::::::::::/::::::::::/:::::\     |
         |    \::::::::::/::::::::::/:::::::\    |
         |     |::::::::/::::::::::/:::::::::|   |
         |     |:::::::/::::::::::/::::::::::\   |
         |     \::::::/::::::::::/::::::::::::\  |
         |      \::::/::::::::::/::::::::::::::| |
         |       |::/::::::::::/:::::::::::::::| |
         |        \/::::::::::/:::::::::::::::::\| 
         |        /\:::::::::/:::::::::::::::::::|
         |       /  \:::::::/::::::::::::::::::::|\
         |      /    |:::::/:::::::::::::::::::::| |
         |     /     \::::/::::::::::::::::::::::| \
min VSF -+----/-------\--/-----------------------|--\--- min VSF
         |   /         \/                        |   \
         +--/----------/\------------------------+----\- DCF
           R1        R2  \                       |     \
                          min HSF                |    max HSF
                                                 VB

这是一个通用的显示器模式图。该图的 x 轴显示时钟频率 (DCF),y 轴表示刷新率 (RR)。该图的填充区域描述了显示器的功能:此区域内的每个点都是可能的视频模式。

标记为 `R1' 和 `R2' 的线表示固定分辨率(例如 640x480);它们旨在说明一个分辨率如何可以通过点时钟和刷新率的许多不同组合来实现。R2 线将代表比 R1 更高的分辨率。

允许区域的顶部和底部边界只是水平线,表示垂直同步频率的限制值。视频带宽是时钟频率的上限,因此由垂直线表示,该垂直线限制了右侧的功能区域。

绘制显示器功能 下,您将找到一个程序,该程序将帮助您为您自己的显示器绘制像这样的图表(但更漂亮,带有 X 图形)。该部分还讨论了有趣的部分;由水平同步频率的限制产生的边界的推导。


8. 配置系统中的权衡

查看我们在上面推导出的公式的另一种方法是

	DCF = RR * HFL * VFL

也就是说,您的点时钟是固定的。您可以使用那些每秒点数来购买刷新率、水平分辨率或垂直分辨率。如果其中一个增加,则另一个或两个都必须减少。

但是请注意,您的刷新率不能大于显示器的最大垂直同步频率。因此,对于任何给定的显示器在给定的点时钟下,存在一个最小的帧长度乘积,低于该乘积您无法强制它。

在选择您的设置时,请记住:如果您将 RR 设置得太低,您将被屏幕闪烁所困扰。将其保持在 60Hz 以上。72Hz 是 VESA 人体工程学标准。120Hz 是美国荧光灯的闪烁频率(100MHz 是欧洲和其他使用 50 周期电流的地方);如果您对这些频率敏感,则需要将其保持在该频率以上。

闪烁非常容易使眼睛疲劳,尽管人眼具有适应性,并且人们对闪烁的耐受性差异很大。如果您以 90% 的视角面对显示器,使用深色背景和良好的前景色对比色,并坚持使用中低强度,您可能会在低至 45Hz 的频率下感到舒适。

最终测试是这样的:使用 xterm -bg white -fg black 打开一个纯白色背景和黑色前景的 xterm,并使其足够大以覆盖整个可视区域。现在将显示器的强度调整到最大设置的 3/4,并将您的脸转离显示器。尝试侧视显示器(让更敏感的周边视觉细胞发挥作用)。如果您感觉不到任何闪烁,或者如果您觉得闪烁是可以容忍的,那么该刷新率对您来说就很好。否则,您最好配置更高的刷新率,因为即使屏幕在正常视觉下看起来还可以,那种半隐形的闪烁也会让您的眼睛非常疲劳并让您头痛。

对于隔行扫描模式,闪烁量取决于更多因素,例如当前垂直分辨率和实际屏幕内容。所以只需进行实验。但是,您不希望低于大约 85Hz 的半帧率。

因此,假设您已经选择了一个最低可接受的刷新率。在选择您的 HFL 和 VFL 时,您将有一些回旋余地。


9. 内存要求

可用的帧缓冲区 RAM 可能会限制您在彩色或灰度显示器上可以实现的分辨率。对于只有两种颜色(白色和黑色,中间没有灰色阴影)的显示器,这可能不是一个因素。

对于 256 色显示器,显示的每个可见点都需要一个字节的视频内存。此字节包含确定为其点生成的红色、绿色和蓝色混合的信息。要获得所需的内存量,请将每行可见点的数量乘以可见行的数量。对于分辨率为 1024x768 的显示器,这将是 1024 x 768 = 786432,这是显示器上可见点的数量。这也以每个点一个字节为单位,是您的适配器卡上需要的视频内存字节数。

因此,您的内存要求通常为 (HR * VR)/1024 Kbytes 的 VRAM,向上舍入(在本例中,它将正好是 768K)。如果您有比严格要求更多的内存,您将有额外的内存用于虚拟屏幕平移。

但是,如果您的视频卡上只有 512K,那么您将无法使用此分辨率。即使您有一个好的显示器,如果没有足够的视频 RAM,您也无法利用显示器的潜力。另一方面,如果您的 SVGA 有 1 兆字节,但您的显示器最多可以显示 800x600,那么无论如何,高分辨率都超出了您的范围(有关可能的补救措施,请参阅 使用隔行扫描模式)。

如果您有比所需更多的内存,请不要担心;X 服务器将通过允许您滚动您的可视区域来利用它(请参阅 Xconfig 文件文档中关于虚拟屏幕大小参数的说明)。另请记住,具有 512K 字节内存的显卡实际上并没有安装 512,000 字节,而是安装了 512 x 1024 = 524,288 字节。

如果您使用 S3 显卡运行 X/Inside,并且愿意接受 16 色(每像素 4 位),您可以在 Xconfig 中设置深度 4,并有效地使您的显卡可以处理的分辨率加倍。例如,S3 显卡通常可以做到 1024x768x256。您可以使它们以深度 4 执行 1280x1024x16。


10. 计算帧大小

警告:此方法是为 multisync 显示器开发的。它可能也适用于固定频率显示器,但不保证!

首先将 DCF 除以您的最高可用 HSF 以获得水平帧长度。

例如;假设您有一个具有 65MHz 点时钟的 Sigma Legend SVGA,并且您的显示器的水平扫描频率为 55KHz。则数量 (DCF / HSF) 为 1181 (65MHz = 65000KHz;65000/55 = 1181)。

现在是我们的第一个黑魔法。您需要将此数字四舍五入到最接近的 8 的倍数。这与 SVGA 和 S3 显卡使用的 VGA 硬件控制器有关;它使用一个 8 位寄存器(左移 3 位),用于真正是 11 位的量。其他显卡类型(如 ATI 8514/A)可能没有此要求,但我们不知道,并且更正不会造成伤害。因此,将可用的水平帧长度数字向下舍入为 1176。

这个数字(DCF / HSF 四舍五入到 8 的倍数)是您可以使用的最小 HFL。您可以通过设置同步脉冲以产生较低的 HSF 来获得更长的 HFL(因此,可能在屏幕上获得更多的水平点)。但是您将付出较慢且更明显的闪烁率的代价。

根据经验,水平帧长度的 80% 可用于水平分辨率,即水平扫描线的可见部分(这大致允许边框和回扫时间——即光束从右屏幕边缘移动到下一个光栅线的左边缘所需的时间)。在本例中,这是 940 个滴答。

现在,为了获得正常的 4:3 屏幕纵横比,请将您的垂直分辨率设置为您刚刚计算出的水平分辨率的 3/4。对于本例,这是 705 个滴答。要获得您的实际 VFL,请将该值乘以 1.05 以获得 740 个滴答。

4:3 并非什么神奇的技术;如果您能通过不同的宽高比来充分利用屏幕实际可用面积,那么没有什么能阻止您使用其他宽高比。它只是让您能够方便地通过对角线尺寸计算出帧高度和帧宽度,您只需将对角线尺寸乘以 0.8 即可得到宽度,乘以 0.6 即可得到高度。

因此,HFL=1176,VFL=740。用 65MHz 除以这两者的乘积,我们得到了非常理想且健康的 74.6Hz 刷新率。太棒了!比 VESA 标准还要好!而且您还获得了 944x705 的分辨率,比您可能预期的 800x600 还要高。真不错!

您甚至可以通过利用显示器通常可以比额定水平同步频率高 2kHz 左右同步的特性,以及稍微降低 VFL(即在上面的例子中,取 940 的不到 75%)来进一步提高刷新率,接近 76Hz。但是,在您尝试这种“过驱动”操作之前,如果您要尝试,请确保您的显示器电子枪可以同步到 76Hz 的垂直频率。(例如,流行的 NEC 4D 就不行。它的垂直同步频率 (VSF) 最高只能达到 75Hz)。(请参阅 过驱动显示器 以获得关于此问题的更一般性讨论。)

到目前为止,这些大部分只是简单的算术和关于光栅显示的基本知识。几乎没有任何神秘之处!


11. 真正的诀窍和同步脉冲

好了,现在您已经为选定的点时钟计算了 HFL/VFL 值,发现刷新率可以接受,并检查了您有足够的显存。现在是真正的诀窍了——您需要知道何时何地放置同步脉冲。

同步脉冲实际上控制着显示器的水平和垂直扫描频率。您从规格表上看到的 HSF 和 VSF 是标称的、近似的最大同步频率。来自适配器卡的信号中的同步脉冲告诉显示器实际运行的速度。

还记得上面的两张图吗?光栅扫描一帧所需的时间只有一部分用于显示可见图像(即您的分辨率)。


11.1. 水平同步

根据之前的定义,跟踪一条水平扫描线需要 HFL 个时钟周期。我们称可见的时钟周期数(您的水平屏幕分辨率)为 HR。显然,根据定义,HR < HFL。为了具体起见,我们假设两者都从同一时刻开始,如下所示

  |___ __ __ __ __ __ __ __ __ __ __ __ __
  |_ _ _ _ _ _ _ _ _ _ _ _                |
  |_______________________|_______________|_____ 
  0                       ^               ^     unit: ticks
                          |   ^       ^   |
                          HR  |       |  HFL
                          |   |<----->|   |
                          |<->|  HSP  |<->|
                          HGT1         HGT2

现在,我们希望放置一个长度为 HSP 的同步脉冲,如上图所示,即在显示数据时钟周期结束和整个帧的时钟周期结束之间。为什么这样做呢?因为如果我们能做到这一点,那么您的屏幕图像就不会向右或向左偏移。它将位于屏幕上应该在的位置,完全覆盖显示器的可视区域。

此外,我们希望在同步脉冲的任一侧留出大约 30 个时钟周期的“保护时间”。这由 HGT1 和 HGT2 表示。在典型的配置中,HGT1 != HGT2,但如果您是从头开始构建配置,您希望从两者相等(即同步脉冲居中)开始您的实验。

同步脉冲错位的症状是图像在屏幕上错位,一边边框过宽,另一边图像环绕屏幕边缘,产生白色边缘线和一侧的“重影”带。严重错位的垂直同步脉冲实际上会导致图像像垂直保持调整不当的电视一样滚动(事实上,这是相同的工作原理)。

如果您幸运的话,显示器的规格页面上会记录其同步脉冲宽度。如果没有,真正的诀窍就开始了...

您将不得不为此部分进行一些反复试验。但在大多数情况下,我们可以安全地假设同步脉冲的长度约为 3.5 到 4.0 微秒。

为了再次具体起见,让我们将 HSP 取为 3.8 微秒(顺便说一句,这对于实验来说是一个不错的起始值)。

现在,使用上面的 65Mhz 时钟定时,我们知道 HSP 相当于 247 个时钟周期(= 65 * 10**6 * 3.8 * 10^-6)[回顾一下 M=10^6,微秒=10^-6]

一些供应商喜欢以时间而不是点宽度来引用他们的水平帧参数。您可能会看到以下术语

有效时间 (HAT)

对应于 HR,但单位是时间(通常是微秒)。HAT * DCF = HR。

消隐时间 (HBT)

对应于 (HFL - HR),但单位是时间(通常是微秒)。HBT * DCF = (HFL - HR)。

前沿 (HFP)

这只是 HGT1。

同步时间

这只是 HSP。

后沿 (HBP)

这只是 HGT2。


11.2. 垂直同步

回到上图,我们如何放置如图所示的 247 个时钟周期?

在我们的示例中,HR 为 944,HFL 为 1176。两者之差为 1176 - 944=232 < 247!显然,我们必须在这里进行一些调整。我们能做什么?

首先是将 1176 提高到 1184,并将 944 降低到 936。现在差值 = 1184-936= 248。嗯,更接近了。

接下来,我们不用 3.8,而是用 3.5 来计算 HSP;然后,我们得到 65*3.5=227。看起来好多了。但是 248 并没有比 227 高多少。通常需要在 HR 和 SP 的开始之间有大约 30 个时钟周期,SP 的结束和 HFL 之间也是如此。而且它们必须是 8 的倍数!我们被困住了吗?

没有。我们这样做,936 % 8 = 0,(936 + 32) % 8 = 0 也是。但是 936 + 32 = 968,968 + 227 = 1195,1195 + 32 = 1227。嗯.. 这看起来还不错。但它不是 8 的倍数,所以我们将其向上舍入到 1232。

但是现在我们遇到了潜在的麻烦,同步脉冲不再位于 h 和 H 的正中间了。幸运的是,使用我们的计算器,我们发现 1232 - 32 = 1200 也是 8 的倍数,并且 (1232 - 32) - 968 = 232,对应于使用 3.57 微秒长的同步脉冲,仍然是合理的。

此外,936/1232 ~ 0.76 或 76%,仍然离 80% 不远,所以应该没问题。

此外,使用当前的水平帧长度,我们基本上要求我们的显示器以 52.7khz (= 65Mhz/1232) 的频率同步,这在其能力范围内。没有问题。

使用我们之前提到的经验法则,936*75%=702,这是我们新的垂直分辨率。702 * 1.05 = 737,这是我们新的垂直帧长度。

屏幕刷新率 = 65Mhz/(737*1232)=71.6 Hz。这仍然非常出色。

计算垂直同步脉冲布局是类似的

   |___ __ __ __ __ __ __ __ __ __ __ __ __
   |_ _ _ _ _ _ _ _ _ _ _ _                |
   |_______________________|_______________|_____ 
   0                      VR              VFL     unit: ticks
                           ^   ^       ^
                           |   |       |
                           |<->|<----->|
                            VGT    VSP

我们从垂直显示数据时钟周期结束后立即开始同步脉冲。VGT 是同步脉冲所需的垂直保护时间。大多数显示器都可以接受 VGT 为 0(无保护时间),我们将在本例中使用它。少数显示器需要两到三个时钟周期的保护时间,添加它通常没有坏处。

回到示例:由于根据帧长度的定义,一个垂直时钟周期是跟踪完整水平帧的时间,因此在我们的示例中,它是 1232/65Mhz=18.95us。

经验表明,垂直同步脉冲应在 50us 和 300us 范围内。例如,让我们使用 150us,它转换为 8 个垂直时钟周期 (150us/18.95us~8)。

一些制造商喜欢以时间而不是点宽度来引用他们的垂直帧参数。您可能会看到以下术语

有效时间 (VAT)

对应于 VR,但单位是毫秒。VAT * VSF = VR。

消隐时间 (VBT)

对应于 (VFL - VR),但单位是毫秒。VBT * VSF = (VFL - VR)。

前沿 (VFP)

这只是 VGT。

同步时间

这只是 VSP。

后沿 (VBP)

这就像垂直同步脉冲之后的第二个保护时间。它通常为零。


12. 整合所有内容

Xconfig 文件中的视频模式表包含多行数字,每一行都是 X 服务器操作的一种完整模式的规范。这些字段分为四个部分:名称部分、时钟频率部分、水平部分和垂直部分。

名称部分包含一个字段,即该行其余部分指定的视频模式的名称。此名称在 Xconfig 文件的“图形驱动程序设置”部分的“Modes”行中引用。如果前一行的名称与当前行相同,则可以省略名称字段。

点时钟部分仅包含视频模式行的点时钟(我们称之为 DCF)字段。此字段中的数字指定用于生成以下部分中的数字的点时钟。

水平部分由四个字段组成,这些字段指定如何在显示器上生成每条水平线。该部分的第一字段包含每行将点亮的点数,以形成图像(我们称之为 HR)。该部分的第二字段 (SH1) 指示水平同步脉冲将在哪个点开始。第三字段 (SH2) 指示水平同步脉冲将在哪个点结束。第四个字段指定总水平帧长度 (HFL)。

垂直部分也包含四个字段。第一个字段包含显示器上将出现的可见行数 (VR)。第二个字段 (SV1) 指示垂直同步脉冲将在哪一行开始。第三个字段 (SV2) 指定垂直同步脉冲将在哪一行结束。第四个字段包含总垂直帧长度 (VFL)。

示例

     #Modename    clock  horizontal timing  vertical timing

     "752x564"     40    752 784  944 1088  564 567 569 611
	           44.5  752 792  976 1240  564 567 570 600

(注意:stock X11R5 不支持小数值点时钟。)

对于 Xconfig,刚刚提到的所有数字 - 行上点亮的点数、将点亮的点与同步脉冲开始分隔开的点数、表示脉冲持续时间的点数以及同步脉冲结束后点数 - 都被加在一起以产生每行的点数。水平点数必须能被 8 整除。

水平数字示例:800 864 1024 1088

此示例行具有点亮的点数 (800),后跟同步脉冲开始时的点数 (864),后跟同步脉冲结束时的点数 (1024),后跟水平线上最后一个点数 (1088)。

再次注意,所有水平数字(800、864、1024 和 1088)都可以被 8 整除!垂直数字则没有此要求。

从显示器顶部到底部的行数构成帧。帧的基本定时信号是行。许多行将包含图像。在最后一条点亮的行显示之后,在生成垂直同步脉冲之前,会发生若干行的延迟。然后,同步脉冲将持续几行,最后生成帧中的最后几行,即脉冲后所需的延迟。指定此操作模式的数字以类似于以下示例的方式输入。

垂直数字示例:600 603 609 630

此示例表明显示器上有 600 条可见行,垂直同步脉冲从第 603 行开始,到第 609 行结束,总共使用了 630 行。

请注意,垂直数字不必能被 8 整除!

让我们回到我们一直在处理的示例。根据以上所述,从现在开始我们所需要做的就是将我们的结果写入 Xconfig,如下所示

<name>   DCF     HR  SH1 SH2   HFL   VR  SV1 SV2 VFL

其中 SH1 是水平同步脉冲的起始时钟周期,SH2 是其结束时钟周期;类似地,SV1 是垂直同步脉冲的起始时钟周期,SV2 是其结束时钟周期。

为了放置这些,回顾上面给出的关于诀窍和同步脉冲的讨论。SH1 是水平同步脉冲前沿开始的点;因此,SH1 = HR + HGT1。SH2 是后沿;因此,SH2 = SH1 + HSP。类似地,SV1 = VR + VGT(但 VGT 通常为零),SV2 = SV1 + VSP。

#name    clock   horizontal timing   vertical timing    flag
936x702  65      936 968 1200 1232   702 702 710 737

不需要特殊标志;这是一种非隔行扫描模式。现在我们真的完成了。


13. 过驱动您的显示器

如果您的显示器是固定频率类型,您绝对应该尝试超过其扫描速率。这样做可能会烧坏您的硬件!过驱动多频显示器可能存在更微妙的问题,您应该意识到这一点。

相比之下,像素时钟高于显示器的最大带宽是相当无害的。有问题的是超过额定的最大同步频率。一些现代显示器可能具有保护电路,可以在危险的扫描速率下关闭显示器,但不要依赖它。特别是,有一些较旧的多频显示器(如 Multisync II)仅使用一个水平变压器。这些显示器在过驱动方面不会有太多保护。虽然您必然具有高压调节电路(这在固定频率显示器中可能不存在),但它不一定涵盖所有可能的频率范围,尤其是在较便宜的型号中。这不仅意味着电路的磨损更大,还可能导致屏幕荧光粉老化更快,并导致显示器发出比规定更多的辐射(包括 X 射线)。

但是,这里基本的问题量级是视频输出驱动器的压摆率(视频信号的陡峭程度),这通常与实际像素频率无关,而是(如果您的主板制造商关心此类问题)与主板的最大像素频率有关。

所以要小心...


14. 使用隔行扫描模式

(本节主要归功于 David Kastrup)

在固定的点时钟下,如果您的显示器的垂直电路能够稳定地支持它,隔行扫描显示器将比非隔行扫描显示器的闪烁明显减少得多。正因为如此,隔行扫描模式首先被发明出来。

隔行扫描模式之所以声名狼藉,是因为在相同的垂直扫描频率 VSF(广告中通常给出的频率)下,它们不如非隔行扫描的同类产品。但是,在相同的水平扫描速率下,它们绝对更优越,而这通常是您的显示器/显卡的决定性限制所在。

在固定的刷新率(或半帧率或 VSF)下,隔行扫描显示器会闪烁得更厉害:90Hz 隔行扫描显示器不如 90Hz 非隔行扫描显示器。但是,它只需要一半的视频带宽和一半的水平扫描速率。如果您将其与具有相同点时钟和相同扫描速率的非隔行扫描模式进行比较,它将非常优越:45Hz 非隔行扫描是无法忍受的。使用 90Hz 隔行扫描,我已经使用我的 Multisync 3D(在 1024x768 分辨率下)工作多年,并且非常满意。我猜您至少需要 70Hz 的非隔行扫描显示器才能获得类似的舒适度。

但是,您必须注意几个要点:仅在高分辨率下使用隔行扫描模式,以便交替点亮的行彼此靠近。您可能需要调整同步脉冲宽度和位置,以获得最稳定的行位置。如果交替的行是亮和暗的,隔行扫描会跳动。我有一个应用程序为菜单背景选择这样的点图案(XCept,我所知道的没有其他应用程序这样做,幸运的是)。我切换到 800x600 分辨率来使用 XCept,否则它真的会伤害我的眼睛。

出于同样的原因,请至少使用 100dpi 的字体,或其他水平笔划至少有两行粗的字体(对于高分辨率,无论如何其他字体都没有意义)。

当然,当您的硬件可以支持具有相似刷新率的非隔行扫描模式时,永远不要使用隔行扫描模式。

但是,如果您发现对于某些分辨率,您正在将显示器或显卡推向其上限,并且获得令人不满意的闪烁或冲淡(带宽超出)的显示效果,您可能需要尝试使用隔行扫描模式来处理相同的分辨率。当然,如果您的显示器的 VSF 已经接近其极限,那么这是没有用的。

隔行扫描模式的设计很简单:像非隔行扫描模式一样进行设计。只需要考虑另外两个因素:您需要垂直总行数为奇数(模式行中的最后一个数字),并且当您指定“隔行扫描”标志时,显示器的实际垂直帧率会加倍。如果除了“Interlace”标志之外,您指定的模式看起来像 45Hz 模式,则您的显示器需要支持 90Hz 帧率。

例如,这是我的 1024x768 隔行扫描的 mode 行:我的 Multisync 3D 将支持高达 90Hz 的垂直频率和 38kHz 的水平频率。

ModeLine "1024x768" 45 1024 1048 1208 1248 768 768 776 807 Interlace

这两个限制都已在此模式下几乎耗尽。指定相同的模式,只是不带“Interlace”标志,仍然几乎达到显示器水平容量的极限(严格来说,略低于垂直扫描速率的下限),但会产生无法忍受的闪烁显示。

基本设计规则:如果您设计的模式低于显示器垂直容量的一半,请使垂直总行数为奇数并添加“Interlace”标志。在大多数情况下,显示质量应该会大大提高。

如果您有一个非隔行扫描模式,该模式在其他方面耗尽了显示器的规格,其中垂直扫描速率比显示器的最大值低约 30% 或更多,则手动设计一个隔行扫描模式(可能具有更高的分辨率)可能会提供更好的结果,但我不能保证。


15. 问答

问:您给出的示例不是标准屏幕尺寸,我可以使用它吗?
问:在给定的 65Mhz 点时钟和 55Khz HSF 下,这是唯一的分辨率吗?
问:您刚刚提到了两种标准分辨率。在 Xconfig 中,有很多标准分辨率可用,您能告诉我调整时序有什么意义吗?
问:您能总结一下我们到目前为止讨论的内容吗?

问:您给出的示例不是标准屏幕尺寸,我可以使用它吗?

答:为什么不呢?没有任何理由说明您必须使用 640x480、800x600 甚至 1024x768。X 服务器允许您非常自由地配置您的硬件。通常需要尝试两到三次才能找到合适的配置。重要的是要追求高刷新率和合理的观看区域,而不是以令人眼花缭乱的闪烁为代价的高分辨率!

问:在给定的 65Mhz 点时钟和 55Khz HSF 下,这是唯一的分辨率吗?

答:绝对不是!我们鼓励您遵循一般程序,并进行一些反复试验,以找到真正符合您喜好的设置。对此进行实验可能非常有趣。大多数设置可能只会给您带来糟糕的视频信号,但实际上,现代多频显示器通常不容易损坏。但请务必确保您的显示器在长时间使用之前可以支持您模式的帧率。

注意固定频率显示器!这种乱 hacking 可能会很快损坏它们。请务必确保您在对它们进行的每次实验中使用有效的刷新率。

问:您刚刚提到了两种标准分辨率。在 Xconfig 中,有很多标准分辨率可用,您能告诉我调整时序有什么意义吗?

答:当然有意义!例如,以当前 Xconfig 中列出的“标准” 640x480 为例。它采用 25Mhz 驱动频率,帧长度为 800 和 525 => 刷新率 ~ 59.5Hz。还不错。但是 28Mhz 是许多 SVGA 板常用的驱动频率。如果我们使用它来驱动 640x480,按照我们上面讨论的程序,您将获得像 812(向下舍入到 808)和 505 这样的帧长度。现在刷新率提高到 68Hz,与标准刷新率相比有了相当显着的提高。

问:您能总结一下我们到目前为止讨论的内容吗?

答:简而言之

  • 对于任何固定的驱动频率,提高最大分辨率都会导致刷新率降低,从而引入更多的闪烁。

  • 如果需要高分辨率并且您的显示器支持它,请尝试获得一个提供匹配点时钟或 DCF 的 SVGA 卡。越高越好!


16. 修复图像问题。

好的,您已经获得了您的 X 配置数字。您将它们与测试模式标签一起放入 Xconfig 中。您启动 X,热键切换到新模式,... 但图像看起来不对劲。您该怎么办?以下是常见视频图像失真及其修复方法的列表。

(修复这些小的失真是 xvidtune(1) 真正擅长的地方。)

您可以通过更改同步脉冲时序来移动图像。您可以通过更改帧长度来缩放图像(您需要移动同步脉冲以使其保持在相同的相对位置,否则缩放也会移动图像)。以下是一些更具体的步骤

水平和垂直位置是独立的。也就是说,水平移动图像不会影响垂直放置,反之亦然。但是,缩放的情况并非完全如此。虽然更改水平尺寸不会对垂直尺寸产生任何影响,反之亦然,但两个方向的总变化可能受到限制。特别是,如果您的图像在两个维度上都太大,您可能必须使用更高的点时钟来修复它。由于这会提高可用分辨率,因此很少成为问题!


16.1. 图像向左或向右偏移

要修复此问题,请移动水平同步脉冲。也就是说,增加或减少(以 8 的倍数)水平定时部分的中间两个数字,这两个数字定义了水平同步脉冲的前沿和后沿。

如果图像向左偏移(右边框太大,您希望将图像向右移动),则减少这些数字。如果图像向右偏移(左边框太大,您希望将其向左移动),则增加同步脉冲。


16.2. 图像向上或向下偏移

要修复此问题,请移动垂直同步脉冲。也就是说,增加或减少垂直定时部分的中间两个数字,这两个数字定义了垂直同步脉冲的前沿和后沿。

如果图像向上偏移(下边框太大,您希望将图像向下移动),则减少这些数字。如果图像向下偏移(上边框太大,您希望将其向上移动),则增加这些数字。


16.3. 图像在水平和垂直方向上都太大

切换到更高的显卡时钟速度。如果您的时钟文件中包含多种模式,则可能是较低速度的模式被错误地激活。


16.4. 图像在水平方向上太宽(太窄)

要修复此问题,请增加(减少)水平帧长度。也就是说,更改第一个定时部分中的第四个数字。为避免移动图像,还要将同步脉冲(第二个和第三个数字)移动一半的距离,以使其保持在相同的相对位置。


16.5. 图像在垂直方向上太深(太浅)

要修复此问题,请增加(减少)垂直帧长度。也就是说,更改第二个定时部分中的第四个数字。为避免移动图像,还要将同步脉冲(第二个和第三个数字)移动一半的距离,以使其保持在相同的相对位置。

任何无法通过组合这些技术处理的失真都可能表明存在更根本的问题,例如计算错误或点时钟速度快于显示器可以处理的速度。

最后,请记住,增加任何帧长度都会降低您的刷新率,反之亦然。

有时,您可以通过调整显示器上的图像控制来修复小的失真。缺点是,如果您为了解决图形模式问题而将控件调整得离中性(出厂)设置太远,则可能会在文本模式下得到一个古怪的图像。最好是获得正确的 modeline。


17. 绘制显示器功能图

要绘制显示器模式图,您需要 gnuplot 软件包(用于类 UNIX 操作系统 的免费绘图语言)和工具 modeplot,这是一个 shell/gnuplot 脚本,用于根据您的显示器特性绘制图表,这些特性作为命令行选项输入。

以下是 modeplot 的副本

#!/bin/sh
#
# modeplot -- generate X mode plot of available monitor modes
#
# Do `modeplot -?' to see the control options.
#

# Monitor description. Bandwidth in MHz, horizontal frequencies in kHz
# and vertical frequencies in Hz.
TITLE="Viewsonic 21PS"
BANDWIDTH=185
MINHSF=31
MAXHSF=85
MINVSF=50
MAXVSF=160
ASPECT="4/3"
vesa=72.5	# VESA-recommended minimum refresh rate

while [ "$1" != "" ] 
do
	case $1 in
	-t) TITLE="$2"; shift;; 
	-b) BANDWIDTH="$2"; shift;; 
	-h) MINHSF="$2" MAXHSF="$3"; shift; shift;; 
	-v) MINVSF="$2" MAXVSF="$3"; shift; shift;; 
	-a) ASPECT="$2"; shift;; 
	-g) GNUOPTS="$2"; shift;; 
	-?) cat <<EOF
modeplot control switches:

-t "<description>"	name of monitor            defaults to "Viewsonic 21PS"
-b <nn>           	bandwidth in MHz           defaults to 185
-h <min> <max>   	min & max HSF (kHz)        defaults to 31 85
-v <min> <max>   	min & max VSF (Hz)         defaults to 50 160
-a <aspect ratio>	aspect ratio               defaults to 4/3
-g "<options>"   	pass options to gnuplot

The -b, -h and -v options are required, -a, -t, -g optional.  You can
use -g to pass a device type to gnuplot so that (for example) modeplot's
output can be redirected to a printer.  See gnuplot(1) for  details.

The modeplot tool was created by Eric S. Raymond <esr@thyrsus.com> based on
analysis and scratch code by Martin Lottermoser <Martin.Lottermoser@mch.sni.de>

This is modeplot $Revision: 1.27 $
EOF
		exit;;
	esac
	shift
done

gnuplot $GNUOPTS <<EOF
set title "$TITLE Mode Plot"

# Magic numbers.  Unfortunately, the plot is quite sensitive to changes in
# these, and they may fail to represent reality on some monitors.  We need
# to fix values to get even an approximation of the mode diagram.  These come
# from looking at lots of values in the ModeDB database.
F1 = 1.30	# multiplier to convert horizontal resolution to frame width
F2 = 1.05	# multiplier to convert vertical resolution to frame height

# Function definitions (multiplication by 1.0 forces real-number arithmetic)
ac = (1.0*$ASPECT)*F1/F2
refresh(hsync, dcf) = ac * (hsync**2)/(1.0*dcf)
dotclock(hsync, rr) = ac * (hsync**2)/(1.0*rr)
resolution(hv, dcf) = dcf * (10**6)/(hv * F1 * F2)

# Put labels on the axes
set xlabel 'DCF (MHz)'
set ylabel 'RR (Hz)' 6	# Put it right over the Y axis

# Generate diagram
set grid
set label "VB" at $BANDWIDTH+1, ($MAXVSF + $MINVSF) / 2 left
set arrow from $BANDWIDTH, $MINVSF to $BANDWIDTH, $MAXVSF nohead
set label "max VSF" at 1, $MAXVSF-1.5
set arrow from 0, $MAXVSF to $BANDWIDTH, $MAXVSF nohead
set label "min VSF" at 1, $MINVSF-1.5
set arrow from 0, $MINVSF to $BANDWIDTH, $MINVSF nohead
set label "min HSF" at dotclock($MINHSF, $MAXVSF+17), $MAXVSF + 17 right
set label "max HSF" at dotclock($MAXHSF, $MAXVSF+17), $MAXVSF + 17 right
set label "VESA $vesa" at 1, $vesa-1.5
set arrow from 0, $vesa to $BANDWIDTH, $vesa nohead # style -1
plot [dcf=0:1.1*$BANDWIDTH] [$MINVSF-10:$MAXVSF+20] \
  refresh($MINHSF, dcf) notitle with lines 1, \
  refresh($MAXHSF, dcf) notitle with lines 1, \
  resolution(640*480,   dcf) title "640x480  " with points 2, \
  resolution(800*600,   dcf) title "800x600  " with points 3, \
  resolution(1024*768,  dcf) title "1024x768 " with points 4, \
  resolution(1280*1024, dcf) title "1280x1024" with points 5, \
  resolution(1600*1280, dcf) title "1600x1200" with points 6

pause 9999
EOF

一旦您确定您已安装了 modeplot 和 gnuplot 软件包,您将需要以下显示器特性

绘图程序需要做出一些简化的假设,这些假设不一定是正确的。这就是导致生成的图表只是粗略描述的原因。这些假设是

作为粗略指南,取 F1 = 1.30 和 F2 = 1.05(参见 计算帧大小)。

现在取一个特定的同步频率 HSF。鉴于刚刚提出的假设,时钟速率 DCF 的每个值都已确定刷新率 RR,即对于 HSF 的每个值,都存在一个函数 RR(DCF)。这可以推导如下。

刷新率等于时钟速率除以帧大小的乘积

	RR = DCF / (HFL * VFL)		(*)

另一方面,水平帧长度等于时钟速率除以水平同步频率

	HFL = DCF / HSF			(**)

VFL 可以通过上述两个假设简化为 HFL

	VFL = F2 * VR
	    = F2 * (HR / AR)
	    = (F2/F1) * HFL / AR	(***)

将 (**) 和 (***) 插入 (*) 我们得到

	RR = DCF / ((F2/F1) * HFL**2 / AR)
	   = (F1/F2) * AR * DCF * (HSF/DCF)**2
	   = (F1/F2) * AR * HSF**2 / DCF

对于固定的 HSF、F1、F2 和 AR,这是我们图表中的一条双曲线。绘制两条这样的曲线,分别对应最小和最大水平同步频率,我们就获得了允许区域的其余两个边界。

穿过功能区域的直线代表特定的分辨率。这基于 (*) 和第二个假设

	RR = DCF / (HFL * VFL) = DCF / (F1 * HR * F2 * VR)

通过为所有感兴趣的分辨率绘制这样的线,人们可以立即读出显示器能够实现的 resolution、时钟速率和刷新率之间的可能关系。请注意,这些线不依赖于显示器属性,但它们确实依赖于第二个假设。

modeplot 工具为您提供了一种简单的方法来做到这一点。执行 modeplot -? 以查看其控制选项。典型的调用如下所示

	modeplot -t "Swan SW617" -b 85 -v 50 90 -h 31 58

-b 选项指定视频带宽;-v 和 -h 设置水平和垂直同步频率范围。

在阅读 modeplot 的输出时,请始终记住它仅提供近似描述。例如,它忽略了由于最小所需同步脉冲宽度而导致的 HFL 限制,并且其准确性仅限于假设的范围。因此,它不能替代 综合考虑 中介绍的详细计算(其中涉及某种神秘方法)。但是,它应该使您更好地了解可能实现的目标以及其中涉及的权衡。


18. 致谢

本文档的最初作者是 Chin Fang.

Eric S. Raymond;修改、重组并大幅度重写了 Chin Fang 的原始文档,试图理解它。在此过程中,他合并了 Bob Crosson 的另一份 How-to 文档的大部分内容.

关于隔行扫描模式的材料主要由 David Kastrup 编写

Nicholas Bodley修正并阐明了关于显示器工作原理的部分。

Payne Freret修正了一些关于显示器设计的细微技术错误。

Martin Lottermoser贡献了使用 gnuplot 制作模式图的想法,并完成了 modeplot 背后的数学分析。发行的 modeplot 是由 ESR 从 Martin 最初针对一个案例的 gnuplot 代码重新设计和通用化的。