7. 显卡

7.1. 历史

很久以前,一家位于加利福尼亚州圣何塞名为 3dfx Interactive 的公司是游戏显卡市场的王者。在 1996 年 10 月,他们发布了 Voodoo I,这是一个巨大的成功。它是第一款硬件加速卡,但只渲染 3D;它必须与 2D 显卡背靠背连接。其理念是 2D 渲染由高质量的 2D 显卡处理(Matrox 在当时非常流行),而 3D 信息(参见 Glide2,第 3.1 节)将传递给 Voodoo I 并进行渲染,使用 Voodoo 快速的硬件来执行必要的图形计算。他们在 1996 年 4 月发布了 Voodoo Rush。它本应是一款更强大的卡,配备 50MHz GPU 和 8MB 内存。更棒的是,它是他们的第一款 2D/3D 组合卡,这意味着它释放了一个宝贵的 PCI 插槽(当时大多数 PC 只有几个 PCI 插槽),但 Rush 并不受欢迎。3dfx 从 Rush 中移除了多纹理单元,其性能不如 Voodoo I。当时,ATI 有他们的 Rage 系列,而 nVidia 有他们的 Riva 128,但 Voodoo I 将它们都远远甩在后面。

这对 Linux 来说是一个美好的时代。id Software 开源了 Doom 代码库,并将 Quake I 移植到 Linux(1996 年 12 月)。我们开始品尝到真正的商业游戏的滋味。生活很简单:你购买一块 Voodoo 显卡。感觉很好,因为 3dfx 开源了他们的驱动程序。显卡之王与 Linux 开发者合作。我们不仅拥有最好的显卡,而且驱动程序都是开源的。

1998 年 3 月,3dfx 发布了他们的 Voodoo II,具有 3.6GB/秒的内存带宽、12MB 的显存和 90MHz 的核心频率。它支持高达 1024x768 的分辨率。这是 3dfx 的鼎盛时期。像 Voodoo I 一样,Voodoo II 也是一款仅支持 3D 的卡,并与 2D 显卡背靠背连接。Voodoo Banshee 于 1998 年 9 月发布,作为一款 2D/3D 组合卡,就像 Rush 一样。尽管核心频率更快,达到 100MHz,但 Banshee 的性能不如 Voodoo II,因为它的多纹理单元被移除,就像 Rush 一样。而且再次像 Rush 一样,它不受欢迎。但 3dfx 仍然是至高无上的,没有人能撼动他们。

1999 年 4 月,Voodoo III 发布。Voodoo III 有许多型号,核心频率从 143MHz 到 183MHz 不等。有带电视输出的版本。有 PCI 和 AGP 版本(它是第一款 AGP 显卡)。这是又一次成功,但 3dfx 开始输给 nVidia,后者发布了他们的 TNT 2。TNT 2 的性能超过了 Voodoo II,并在全 32 位色彩下加速了 3D 图形,而 Voodoo 显卡仍然停留在 16 位色彩。但对于 Linux 来说,生活仍然美好。我们有一款几乎与 nVidia 并驾齐驱的显卡,我们的驱动程序是开源的,并且在 1999 年 12 月,id Software 给了我们一份厚礼:他们开源了 Quake I 代码库。

然后 nVidia 在 1999 年 10 月发布了 GeForce 256。3dfx 的 Voodoo IV,它的直接竞争对手,大约晚了一年发布,这对于在竞争激烈的尖端市场中来说是非常糟糕的。当 nVidia 将真正的研发投入到他们的显卡中时,3dfx 只是简单地添加更多更快的内存。Voodoo IV 和 V 以全 32bpp 色彩渲染,具有出色的 AA 支持(第 7.4.3 节),配备了第二个 GPU,更多的内存,并且可以说是显卡之王。然而,3dfx 延迟发布 Voodoo IV 和 V,再加上 GeForce 的价格只有一半,这意味着 3dfx 正在迅速衰落。对于 Linux 来说,最新的 Voodoo 显卡只能以 16 位和 24 位色彩加速。更糟糕的是,Linux 驱动程序没有使用 Voodoo V 的第二个 GPU(直到今天,Voodoo V 在 Linux 上的功能仍然相当于单 GPU 的 Voodoo IV)。大多数 Windows 用户都转向了 nVidia,尽管 nVidia 驱动程序是专有的,但即使是 Linux 用户也开始跳上 nVidia 的行列。最大的 Linux 服务器供应商 VA Linux 将 nVidia 安装到他们的机器中。

然后在 2000 年 4 月,3dfx 从另一个方面受到了攻击:ATI 开始发布他们的第一代 Radeon。在此之前,ATI 一直是一家具有创新精神(他们在 1996 年左右开发了自己的 3D 加速芯片,与 3dfx 大致同时),但沉睡的图形芯片组制造商。Radeon 是他们的第一款 3D 加速卡,引起了游戏玩家的真正兴趣。他们的 Radeon 击败了 nVidia 和 3dfx。他们与 Linux 开发者合作,开源了所有驱动程序,并被誉为 Linux 游戏的伟大希望。nVidia 挥舞着拳头卷土重来,这对 3dfx 来说太过分了。由于在基准测试中输给了 GeForce 和 Radeon,新卡发布延迟和价格过高,3dfx 失去了市场份额,也没有资金继续经营下去。2001 年 4 月 18 日,他们将大部分资产和技术出售给了 nVidia,并在 2002 年 10 月,他们最终宣布破产。

3dfx 的 demise 非常突然,是对开源社区的当头一棒。我仍然记得我的朋友 Gabe Rosa 发邮件给我,内容只有 "看看 /。" 并看到了这个消息。这是 Linux 游戏史上第二糟糕的一天(第一糟糕的是 Loki 的 demise)。这也很可惜。3dfx 正准备发布一款新的 Voodoo V,配备 4 个 GPU,这将击败 ATI 和 nVidia 的产品,以及一款代号为 "Rampage" 的新卡,据报道这将使他们重新稳居王者之位。有报道称 Rampage 的技术(已出售给 nVidia)被用于 GeForce 5900。对于 3 年前的技术来说,这已经相当不错了!

起初,事情仍然很简单。Linux 游戏玩家要么保留他们的开源 Voodoo 显卡,要么购买开源 Radeon 或闭源 GeForce 显卡。然而,随着更大更好的游戏的出现,Voodoo 显卡不再是现代游戏的 viable 显卡只是时间问题。人们仍然在使用 Voodoo 显卡,但它们基本上已经退出了游戏领域。

ATI 开始发布大量版本的显卡,跟上它们的步伐和术语变得非常困难。ATI 与 nVidia 一起,成为了山丘之王。自那时以来,他们的产品一直势均力敌,GeForce 领先的次数略多于 Radeon。但 Radeon 的驱动程序是开源的,所以许多 Linux 用户坚持使用它们。然后事情变得更加复杂。

ATI 开始越来越不愿意为他们的新版本开源驱动程序,突然之间,谁是 "好人" 变得不清楚了。nVidia 的官方说法是他们从另一家公司许可了一些他们的 GL 代码,因此是不可发布的。据推测,ATI 不想发布驱动程序是为了保守他们的商业秘密,嗯,秘密。情况变得更糟。ATI Linux 驱动程序一直受到性能极差的困扰。即使 ATI 的产品在 Windows 上优于当前的 GeForce 产品,但在 Linux 上,该显卡总是被 GeForce 击败。由于 ATI Linux 驱动程序的困境,Linux 用户无法使用基于 MS Windows 的基准测试或显卡统计数据。它们根本不适用于我们。这就是我们目前所处的情况。

作为最后一点说明,我所知的唯一的系统性 Linux 显卡基准测试工作是在 2001 年 3 月完成的,在 Radeon 32 DDR 和 GeForce 2 之间进行的。你可以自己阅读它,网址是 http://www.linuxhardware.org/features/01/03/19/0357219.shtml,但结论是 GeForce 2 坚定而彻底地击败了 Radeon 32 DDR。

7.2. 当前状态(2004 年 3 月 1 日)

nVidia 的最新产品是 GeForce 5900,基于 NV35 芯片组。Linux 对其提供良好支持,并提供高质量但专有的驱动程序。nVidia 使用了方便的组合驱动程序架构;他们的驱动程序将支持从 TNT 2 一直到 GeForce 5900 的所有显卡。虽然他们的驱动程序是闭源的,但作为一家公司,nVidia 一直对 Linux 用户提供支持和友好。

ATI 一直与 Linux 开发者合作开发他们的 Radeon 显卡,直到包括 Radeon 9200,这些显卡在 XFree86 中具有 2D 和 3D 支持。我不完全确定这些开源驱动程序的质量,但是,在第一代 Radeon 显卡下,命运战士 I 和 重金属 仍然存在不透明纹理问题。在 9200 之后,你需要使用 ATI 的二进制专有驱动程序,可以从 ATI 的网站以 rpm 格式下载。据称这些驱动程序非常糟糕;我的一个朋友声称他的 GeForce 4400 的性能优于他的 Radeon 9700 pro。这太可耻了。

在纸面上,以及在 Windows 基准测试中,Radeon 9800 击败了构思不周的 GeForce 5800,并略微领先于 GeForce 5900。在纸面上,它显然是更令人印象深刻的显卡。但同样,驱动程序问题使这些信息对我们来说无法使用。如果你铁了心要购买 Linux 上最好的显卡,你将需要选择 GeForce 5900。

7.2.1. SVGAlib 支持

截至 2002 年 6 月,SVGAlib 对 Radeon 显卡的支持不稳定。开发者报告称 SVGAlib 在 Radeon 7500、Radeon QD(64MB DDR 型号)上可以工作,但在 Radeon VE 上存在问题。

我没有关于 SVGAlib 和 GeForce 显卡的信息。

7.3. 我应该购买哪种显卡?(2004 年 3 月 1 日)

去年的答案非常困难,但这是我目前的看法

  1. 所有 GeForce 显卡都需要专有驱动程序,这将 "污染" 你的内核。然而,Radeon 9200 之后的所有 ATI 显卡也都需要专有驱动程序,这也将 "污染" 你的内核。

  2. nVidia 已经证明他们足够关心 Linux,为 Linux 编写和维护最新的高质量驱动程序。即使在 ATI 开源其显卡驱动程序时,他们也玩起了 "我们将让 Linux 开发者为我们编写驱动程序" 的游戏。他们目前的专有驱动程序低于标准。

  3. 当前的 Radeon 9800 在基准测试和显卡规格方面勉强击败了 GeForce 5900,但 Linux 用户不会从中受益,因为驱动程序问题。

  4. ATI 有着非常长的历史,一旦他们可以摆脱硬件,就会迅速停止对其的支持。

  5. 在 MS Windows 上,当 GeForce 击败其主要竞争对手 Radeon 时,评测声称 Radeon 通常具有更好的视觉效果。我不知道这在 Linux 上如何体现。

不要购买 GeForce 5800。显卡评测声称它存在严重的 散热、噪音和灰尘 问题。由于其风扇发出的噪音,它被非正式地称为 "除尘器"。

如果你绝对只想在你的系统上使用开源驱动程序,Radeon 9200 是你可以购买的最好的显卡。

如果你有 Linux/Windows 双启动,请考虑 Radeon 9800 或 GeForce 5900。Radeon 在 Windows 上会稍强一些。GeForce 在 Linux 上会更强一些。

如果你只有 Linux 系统,GeForce 5900 是你的最佳选择。截至今天,256MB 版本售价高达 350 美元,但 128MB 版本更合理。

7.4. 定义:显卡和 3D 术语

我们将介绍显卡和 3D 图形术语。这些材料对于实际使游戏运行起来并非至关重要,但可能有助于决定哪些硬件和软件选项最适合你。

7.4.1. 纹理

渲染场景基本上由多边形和线条组成。纹理是覆盖 3D 世界多边形的 2D 图像(通常是位图)。可以将其视为多边形的涂层。

7.4.2. T&L:变换和光照

T&L 是将所有 3D 世界信息(位置、距离和光源)转换为实际显示在屏幕上的 2D 图像的过程。

7.4.3. AA:抗锯齿

抗锯齿是平滑渲染曲线或多边形边缘的锯齿状边缘。像素是矩形对象,因此用它们绘制倾斜的线条或曲线会导致 "阶梯" 效果,也称为 "锯齿"。这就是当像素使本应平滑的曲线或线条变得锯齿状时。AA 使用 CPU 密集型过滤来平滑这些锯齿状边缘。这可以改善游戏的视觉效果,但也可能显着降低性能。

AA 在许多情况下使用。例如,当你放大图片时,你会注意到曾经平滑的线条变得锯齿状(用 GIMP 尝试一下)。字体渲染是 AA 的另一个重要应用。

AA 可以由应用程序本身完成(如 GIMP 或 XFree86 字体系统),也可以由硬件完成(如果你的显卡支持)。由于 AA 是 CPU 密集型的,因此最好在硬件中执行,但如果我们谈论的是半静态应用程序,如 GIMP,这真的不是问题。对于动态情况,如游戏,在硬件中进行 AA 可能至关重要。

7.4.4. FSAA:全屏抗锯齿

FSAA 通常涉及在单独的帧缓冲区中绘制整个屏幕的放大版本,对整个图像执行 AA,并将其重新缩放到正常分辨率。你可以想象,这是极其 CPU 密集型的。你永远不会看到非硬件加速的 FSAA。

7.4.5. Mip 贴图

Mip 贴图是一种技术,其中同一纹理的多个缩放副本存储在显卡内存中,以表示不同距离处的纹理。当纹理距离较远时,使用较小版本的纹理(mip 贴图)。当纹理靠近时,使用较大的纹理。Mip 贴图可以独立于过滤方法使用(第 7.4.6 节)。Mip 贴图降低了内存带宽要求,因为图像在硬件中,但它也提供了更好的渲染图像质量。

7.4.6. 纹理过滤

纹理过滤是呈现精美 3D 图形所需的基本功能。它用于多种目的,例如使相邻纹理平滑混合,以及使从一定角度观看的纹理(想想从极端角度观看广告牌)看起来逼真。有几种常见的纹理过滤技术,包括点采样、双线性、三线性和各向异性过滤。

当我谈到 "性能损失" 时,请记住,性能损失取决于你运行的分辨率。例如,在低分辨率下,使用三线性过滤而不是双线性过滤可能只会产生非常轻微的损失。但在高分辨率下,性能损失可能是巨大的。此外,我不知道有任何显卡使用各向异性纹理过滤。TNT 驱动程序声称他们这样做,但我读到这些驱动程序在实际将图像渲染到屏幕时仍然使用三线性过滤。

7.4.6.1. 点采样纹理过滤

点采样在今天很少见,但如果你运行 "软件渲染" 的游戏(如果你在没有 3D 加速卡的情况下运行 3D 加速游戏,你需要这样做),你可能会看到它被使用。

7.4.6.2. 双线性纹理过滤

双线性过滤是一种计算成本低廉但质量较低的纹理过滤。它通过对四个最近的(上方、下方、左侧和右侧)纹素的颜色进行采样来近似纹理之间的间隙。所有现代 3D 加速显卡都可以在硬件中进行双线性过滤,而不会产生性能损失。

7.4.6.3. 三线性纹理过滤

三线性过滤是一种高质量的双线性过滤器,它使用最合适的 mip 贴图中的四个最近像素来产生 mip 贴图级别之间更平滑的过渡。三线性过滤对八个像素进行采样并在渲染之前对其进行插值。三线性过滤始终使用 mip 贴图。三线性过滤消除了相邻 mip 贴图级别之间出现的条带效应。大多数现代 3D 加速显卡都可以在硬件中进行三线性过滤,而不会产生性能损失。

7.4.6.4. 各向异性纹理过滤

各向异性过滤是三种常见纹理过滤方法中最好但 CPU 密集程度最高的。三线性过滤能够产生精美的视觉效果,但它仅从方形区域采样,在某些情况下,这不是理想的方法。各向异性(意思是 "来自任何方向")从超过 8 个像素采样。采样的像素数量以及它使用的采样像素取决于表面相对于屏幕的视角。当以一定角度查看字母数字字符时,它会大放异彩。

7.4.7. Z 缓冲

Z 缓冲区是 RAM 的一部分,它表示查看者(你)与对象每个像素之间的距离。许多现代 3D 加速卡在其显存中都有 Z 缓冲区,这大大加快了速度,但 Z 缓冲也可以由应用程序的渲染引擎完成。然而,这种事情显然应该尽可能在硬件中完成。

每个对象都有一个堆叠顺序,就像一副牌一样。当对象被渲染到 2D 帧缓冲区时,渲染引擎通过使用 Z 缓冲区来移除隐藏表面。有两种方法可以实现这一点。 笨引擎首先绘制远处的对象,最后绘制近处的对象,从而遮挡 Z 缓冲区中低于它们的对象。智能引擎计算对象哪些部分将被高于它们的对象遮挡,并简单地不渲染你无论如何都看不到的部分。对于复杂的纹理,这可以大大节省处理器的工作量。