版权所有 © 2001, 2002 Peter Jay Salzman
版权所有 © 2003, 2004 Peter Jay Salzman, Fr�d�ric Delanoy
2004-11-13 v.1.0.6
摘要
在与 Linux 相关的邮件列表和新闻组中,同样的问题被反复提出。许多问题出现的原因是人们对 Linux 上事物“工作”方式的了解不够,至少在游戏方面是这样。游戏可能是一项艰巨的追求;它需要来自范围广泛的主题的知识,从编译器到库,再到系统管理、网络、XFree86 管理……你明白我的意思。你电脑的每个方面都在游戏中扮演着角色。这是一个要求很高的主题,但这个事实被游戏的主要目标所掩盖:为了获得乐趣和放松心情。
本文档是一个跳板,用于解决最常见的问题,并使人们能够开始智能地思考他们的游戏发生了什么。就像 Linux 上的任何其他事物一样,你需要更多地了解系统幕后发生的事情,才能保持游戏的健康,或者在它们出现问题时进行诊断和修复。
如果您对此 HOWTO 有任何想法、更正或疑问,请给我发送电子邮件。通过收到对此 howto 的反馈(即使我没有时间回复),你让我感觉我在做一些有用的事情。反过来,它激励我写更多内容并添加到本文档中。您可以通过以下方式联系我<p(at)dirac(dot)org>。我的网页是 http://www.dirac.org/p,我的 Linux 页面是 http://www.dirac.org/linux。请发送有关此 howto 的评论和建议。即使我不采纳你的建议,你的意见也会受到热烈欢迎。
我假设你已经掌握了 Linux 的工作知识,所以我使用了一些主题,如运行级别和模块,而没有定义它们。如果有足够的问题(甚至抗议),我将向本文档添加更多基本信息。
本文档版权所有 (c) 2001-2002 Peter Jay Salzman,<p(at)dirac(dot)org>;2003-2004 Peter Jay Salzman 和 Fr�d�ric Delanoy。允许根据开放软件许可证,版本 1.1 的条款复制、分发和/或修改本文档,但我在下一段中列出的条款除外。我讨厌包含许可证的 HOWTO;这会浪费树木。你可以在 https://open-source.org.cn/licenses/osl-1.1.txt 上阅读 OSL。
如果您想创建衍生作品或出于商业目的发布此 HOWTO,我希望您先与我联系。这将使我有机会给你最新版本。我也希望得到您正在做的任何事情的副本,或者一个菠菜、大蒜、蘑菇、羊乳酪和朝鲜蓟心的披萨。
感谢以下人员的广泛评论、更正和差异。他们的努力超出了职责范围
Fr�d�ric Delanoy, Moritz Muehlenhoff<jmm(at)Informatik(dot)uni-bremen(dot)de>、Mike Phillips、Ioan Rogers<buck(at)aiur(dot)co(dot)uk>
我还要感谢以下人员发送评论和更正。没有他们的帮助,就会有比你能摆动棍子的更多排版错误和错误
Michael McDonnell
最新版本可以在 http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/lgh/LG-HOWTO 或 http://www.dirac.org/linux/writing 找到,但这是我自己的个人工作副本。如果我正在处理 HOWTO,我个人网站上的版本可能会损坏。sourceforge 上的版本是最新的,但保证不会损坏,但它可能存在小故障,例如未完成的段落。 :)
最新稳定版本可以在 http://www.tldp.org 找到。
Dmitry Samoyloff<dsamoyloff(at)yandex(dot)ru>是俄语翻译的维护者。最新版本可以在 http://www.dirac.org/linux/writing 找到。
L�szl� Daczi<dacas(at)korhaz(dot)rethy(dot)hu>匈牙利 LDP 协调员宣布 Szilard Ivan 制作了匈牙利语翻译,可在 http://tldp.fsf.hu/HOWTO/Linux-Gamers-HOWTO-hu 获取。
不是每个人都知道有哪些不同的游戏类型,因此为了形成我们可以使用的通用语言,我将介绍每种游戏类型并提供一个非常简短的历史。
虽然街机游戏在 80 年代达到了鼎盛时期,但它们仍然非常受欢迎。没有什么可以取代走进黑暗、拥挤和嘈杂的街机画廊,将四分之一的硬币放入你最喜欢的机器中,并玩一个老式的太空侵略者游戏。街机风格游戏试图模拟街机游戏本身。这些东西的数量非常庞大,几乎不可能全部列举出来,但它们包括小行星、太空侵略者、吃豆人、导弹司令部和 Galaxian 的克隆。
基于计算机的纸牌游戏模拟纸牌游戏,如扑克或单人纸牌。该程序可以模拟你的对手。
逻辑游戏通常模拟一些众所周知的逻辑谜题,如 Master Mind 或你必须将滑动编号的图块按顺序放置在盒子内的游戏。
基于计算机的棋盘游戏模拟某种棋盘游戏,你会在桌面上与朋友一起玩,如垄断、Mille Bourne、国际象棋或跳棋。该程序可以模拟你的对手。
很久以前,当 Apple ][、Commodore 和 Atari 统治世界的时候,文本冒险游戏是“聪明人”的首选游戏。你会得到一个场景,并且可以与你所处的那个世界进行互动。
You are in a room. It is pitch dark and you're likely to be eaten by a grue. > Light lantern with match. You light the lantern. This room appears to be a kitchen. There's a table with a book in the center. You also see an oven, refrigerator and a door leading east. > Open the oven. In the oven you see a brown paper bag. > Take the bag. Open the bag. Close the oven. Inside the bag is a some garlic and a cheese sandwich. The oven door is now closed. |
那时,文本冒险游戏是磁盘或磁带上的独立可执行文件。现在,通常有一个数据文件和一个解释器。解释器读取数据文件并提供游戏界面。数据文件是实际的游戏本身,类似于第一人称射击游戏(第 2.7 节)和wad文件之间的关系。
第一个冒险游戏是 Adventure(实际上是 “ADVENT”,于 1972 年在 PDP-1 上编写)。你可以自己玩 Adventure (实际上是一个后代); 它包含在大多数 Linux 发行版的 “bsd games” 中。文本冒险游戏由 Scott Adams(第 11.5 节)推广,并在 80 年代后期随着 Infocom(第 11.4 节)达到顶峰,它们也可以在 Linux 下玩。
随着计算机图形变得更容易和更强大,文本冒险游戏孕育了图形冒险游戏。商业互动小说的消亡或多或少与 Infocom 的破产同时发生。
图形冒险游戏本质上是增强版的文本冒险游戏。它们使用图形的程度差异很大。早在 80 年代,它们只不过是显示静态图形屏幕的文本冒险游戏。当你拿起一个物品时,背景会重新绘制,而该物品不会出现。典型的例子是所谓的“高分辨率冒险”,如《巫师与公主》。后来,复杂的图形冒险游戏让你的角色在屏幕上漫游,你甚至可以使用鼠标,但界面仍然是纯文本的。
接下来是“点击式冒险游戏”,它们基本上没有文本界面,并且通常具有动态图形,例如当你在决定下一步做什么时,一只猫在房间里闲逛。在这些游戏中,你指向一个对象(比如一本书),然后可以从下拉列表中选择功能。有点像面向对象式的冒险游戏。:) 为 Linux 原生编写的图形冒险游戏并不多。我唯一能想到的是 Hopkins FBI (它恰好是我最喜欢的 Linux 游戏)。
模拟游戏力求让玩家沉浸在他们通常无法接触的东西的控制之下。这可以是像战斗机这样的真实的东西,也可以是像机械化战士战斗单元这样的虚构的东西。在任何一种情况下,模拟游戏都力求真实。
有些模拟游戏几乎没有策略。它们只是让你坐在驾驶舱里,让你体验驾驶飞机的刺激。有些则相当复杂,并且模拟游戏和策略游戏之间经常存在界限(第 2.6 节)。一个很好的例子是 Heavy Gear III 或 Flight Gear。如今,模拟游戏和策略游戏几乎无法区分,但在很久以前,模拟游戏是实时的,而策略游戏是回合制的。这对于现代使用来说很尴尬,因为像 Warcraft 这样被大家认为是策略游戏的游戏,按定义来说,应该算作模拟游戏。
策略游戏起源于像 Panzer Leader 这样的旧 Avalon 型棋盘游戏,以及由 SSI 出版的旧战争策略游戏。一般来说,它们会模拟某种场景。该场景可以是和平的,例如经营一个成功的城市 (SimCity),也可以是不和平的,例如非法毒品销售行动 (DrugWars) 或像 Myth II 这样的全面战争策略游戏。这类游戏通常需要很长时间才能完成,并且需要大量的脑力。
策略游戏可以进一步分为两类:实时和回合制。实时策略游戏基于你-打盹-你-输的概念。例如,你正在管理一个城市,某个地方发生了火灾。你动员消防员的时间越长,火灾造成的损失就越大。回合制策略游戏更像国际象棋——计算机走一步,然后玩家走一步。
透过那边窗户照进来的光是什么?一定是双管猎枪的闪光!我们与 FPS 游戏有着漫长而曲折的历史,它始于 id Software 开源 Doom 的代码。该代码库被多次分支和合并。其他以前封闭的引擎也被开放,许多引擎可以通过模拟器玩,许多商业 FPS 游戏都为 Linux 发布,并且有相当多的 FPS 引擎是从开源项目开始的。虽然你可能无法在 Linux 下玩你最喜欢的 FPS(Half-Life 在 winex 下运行良好),但 Linux 在这方面绝对没有任何缺陷!
第一人称射击游戏的特点是两件事。首先,你几乎炸掉你看到的一切。其次,动作以第一人称进行。也就是说,通过正在进行所有射击的角色的眼睛。你甚至可以在屏幕底部看到你的手或武器。它们可以设置在幻想(Hexen)、科幻(Quake II)、当今“现实世界”(Soldier Of Fortune)和许多其他设置中。
与文本冒险游戏一样,FPS 也遵循引擎/数据文件格式。引擎指的是实际的游戏本身 (Doom, Quake, Heretic2),并播放数据文件 (doom2.wad, pak0.pak等) 中概述的地图和坏人。许多 FPS 游戏允许人们编写自己的非商业数据文件。有成百上千个非商业 Doom 数据文件可以从网上免费下载。通常,公司会将他们的引擎发布给开源社区,以便我们可以对其进行黑客攻击和改进。但是,原始数据文件仍然是专有的。直到今天,你仍然需要购买doom.wad.
横向卷轴游戏类似于 FPS,但你将你的角色视为一个 2D 人物,他在各种屏幕上奔跑,射击东西或执行任务。例如,Linux 上的 Abuse 和原始的 Duke Nukem。它们不一定必须是暴力的,例如 xscavenger,这是旧 8 位游戏 Lode Runner 的克隆。
类似于 FPS,但你以第三人称和 3D 视角查看你的角色。在现代第三人称射击游戏中,你通常可以做一些非常棒的动作,例如成龙式的后空翻和侧滚翻。典型的例子是 Tomb Raider。在 Linux 平台上,我们有 Heretic 2 和 Heavy Metal FAKK2。
任何玩过像 Dungeons & Dragons 或 Call of Cthulhu 这样的游戏的人都知道 RPG 是什么。你扮演一个角色,有时不止一个,其特征在于特征(例如力量、敏捷性)、技能(例如炸药、编筐、机械)和属性(等级、现金)。当你玩游戏时,角色变得更加强大,游戏也会相应地进行调整,因此在高等级时,你不再与兽人战斗,而是开始与黑龙战斗。奖励也相应增加。在低等级时,你可能会得到一些金币作为赢得战斗的奖励。在高等级时,你可能会得到一把魔法剑或一把超棒的突击步枪。
RPG 通常有一个具有明确结局的任务。在 nethack 中,你需要为你寻找 Yendor 的护身符。在 Ultima II 中,你摧毁了邪恶的女巫 Minax。在某个时候,你的角色变得足够强大,你可以“全力以赴”并尝试完成任务。
虽然由 Richard Garriot(又名 Lord British)为 Origin 编写的非常受欢迎的 Ultima 系列并不是第一个 RPG,但它推广并将 RPG 类型推向了主流。Ultima I 于 1987 年发布,是启动 9 个(取决于你想如何计算它们)非常受欢迎的续集的游戏,最后以 Ultima IX: Ascension 结尾。你可以在 Linux 下使用 Exult 玩 Ultima VII(第 11.7 节)。
Linux 上的典型 RPG 是 Rogue(ncurses 库最初是 Rogue 的屏幕处理例程!),它有无限的变体,如 Zangband 和 Nethack(它本身也有许多变体)。有些 RPG 非常复杂,是编程的伟大壮举。Linux 的商业 RPG 似乎存在不足。除了 rogue 变体之外,开源 RPG 也存在不足。
我们将介绍你在 Linux 下会看到的不同的游戏库。
Glide2 是一个底层图形 API 和驱动程序,用于访问 XFree86 3.x 下 3dfx 的 Voodoo I、II 和 III 卡上的 3D 硬件加速功能。
程序只能通过以下两种方式之一使用这些卡的特殊硬件加速功能,通过使用 Glide2 库:
直接使用 Glide2 编写 (Myth II, Descent III)
间接使用构建了 Glide2 后端的 Mesa 来模拟 OpenGL (Rune, Unreal Tournament)
3dfx 向开源社区开放了规范和源代码。这使得 Daryll Strauss 能够将 Glide2 移植到 Linux,这使得 XFree86 3.x 用户能够在 Linux 下使用 Voodoo I、II 和 III 卡。
由于 Glide2 直接访问显卡,因此 Glide2 应用程序要么需要由 root 运行,要么需要设置为 setuid root。一种解决方法是创建内核 3dfx 模块。此模块(及其设备文件/dev/3dfx)允许非 root 用户的非 setuid 应用程序进行 Glide2 图形硬件加速。
不幸的是,Glide2 也是一个已死的问题。它仅用于 Voodoo I、II、III 板(这些板正在过时),在 XFree86 3.x 下(大多数人使用 XFree86 4.x)。并且由于 3dfx 现在是一家已倒闭的公司,因此可以肯定的是,不会再对 Glide2 进行任何工作,也不会再有任何使用 Glide2 编写的游戏。
与 Glide2 不同,Glide3 不是用于游戏编程的 API。它仅用于支持 XFree86 4.x 下 Voodoo III、IV 和 V 板上的 DRI。没有哪个使用 Glide2 的游戏可以与 Glide3 一起使用。这不应该令人惊讶,因为 Glide2 和 Glide3 支持不同的显卡和不同版本的 XFree86。唯一可以同时使用 Glide2(在 XFree86 3.x 下)和 Glide3(在 XFree86 4.x 下)的显卡是 Voodoo III。据报道,使用 Glide2 的 Voodoo III 的性能将优于使用 Glide3 的 Voodoo III。
当你在 XFree86 4.x 下使用 Voodoo III、IV 或 V 时,你需要使用编译为使用 Glide3 作为后端的 Mesa 版本(参见第 3.4 节),以确保你的系统上具有硬件加速的 OpenGL。
OpenGL 是一个高级图形编程 API,最初由 SGI 开发,它已成为 2D 和 3D 图形编程的行业标准。它由 Architectural Revision Board (ARB) 定义和维护,该组织包括来自 SGI、IBM、DEC 和 Microsoft 的代表。OpenGL 为 2D 和 3D 图形操作提供了一个强大、完整和通用的功能集。
OpenGL 有 3 个典型部分:
GL:OpenGL 核心调用
GLU:实用程序调用
GLUT:与操作系统无关的窗口事件(鼠标、键盘等)处理程序。
OpenGL 不仅仅是一个 API,它也是一个由 SGI 编写的实现。该实现会尝试在各种图形操作中使用硬件加速(如果可用),这取决于你电脑中的显卡。如果硬件加速对于特定任务不可行,OpenGL 会退回到软件渲染。这意味着,当你从 SGI 获取 OpenGL 时,如果你想要任何类型的硬件加速,那么它必须是专门为某种显卡编写和编译的 OpenGL。否则,你只能得到软件渲染。OpenGL 的克隆版本,如 Mesa,也是如此。
OpenGL 是 Direct3D 的开源等价物,Direct3D 是 DirectX 的一个组件 (3.14 节)。重要的区别在于,由于 OpenGL 是开放的(而 DirectX 是封闭的),因此用 OpenGL 编写的游戏比用 DirectX 编写的游戏更容易移植到 Linux 上并进行协同开发。
Mesa <http://www.mesa3d.org> 是 OpenGL API 的一个免费实现,由 Brian Paul 设计和编写。虽然它没有经过官方认证(认证所需的资金超出了一个开源项目的承受能力),但它几乎是一个完全兼容的 OpenGL 实现,符合 ARB 规范。据报道,Mesa 甚至比 SGI 自己的 OpenGL 实现更快。
与 OpenGL 一样,Mesa 在可能的情况下也会利用硬件加速。当特定的图形任务无法通过显卡进行硬件加速时,它会被软件渲染;该任务由你电脑的 CPU 代替完成。这意味着 Mesa 有不同的构建版本,具体取决于你拥有的显卡类型。每个构建版本使用不同的库作为后端渲染器。例如,如果你在 XFree86 3.x 下使用 Voodoo I、II 或 III 显卡,你将使用 mesa+glide2(由 David Bucciarelli 编写),它是 OpenGL 的 Mesa 实现,使用 Glide2 作为后端来渲染图形操作。
图形渲染有 3 个参与者:客户端应用程序(如 Quake 3)、X 服务器和硬件(显卡)。以前,客户端应用程序被禁止直接写入硬件,这样做是有充分理由的。一个被允许直接写入硬件的程序可以通过多种方式导致系统崩溃。Linux 没有信任程序员编写完全没有错误、协作访问硬件的程序,而是简单地禁止了这种行为。然而,这种情况在 X 4.x 下随着 DRI(直接渲染基础设施 <http://www.dri.sourceforge.net>)的出现而发生了改变。DRI 允许 X 客户端以安全和协作的方式直接将 3D 渲染信息写入显卡。
DRI 让 X 服务器不再干预,因此 3D 驱动程序(Mesa 或 OpenGL)可以直接与硬件通信。这加快了速度。3D 渲染信息甚至不需要进行硬件加速。从技术角度来看,这具有许多优点。
顶点数据不必通过 GLX 进行编码/解码。
图形数据不会通过套接字发送到 X 服务器。
在单处理器机器上,CPU 不必在 XFree86 和其客户端之间切换上下文来渲染图形。
Utah-GLX 是 DRI 的前身。它在数据分离和访问显卡的方法方面做出了一些不同的设计决策,例如依赖于 root 访问权限而不是创建内核基础设施来实现安全访问。它为一些 DRI 不太支持的显卡提供支持,例如 ATI Rage Pro 系列、S3 Virge(虽然任何人使用它进行游戏都是,嗯,疯了),以及一个开源的 TNT/TNT2 驱动程序(非常不完整)。TNT/TNT2 驱动程序基于对 nVidia 发布的 X 3.3 驱动程序混淆源代码的反向工程。但是,它们确实不完整,并且实际上是无法使用的。
有时你会看到一些怪人(带着尊敬的语气)用 xlib 编写游戏。它是一组 C 库,构成了 XFree86 的最低级别编程接口。任何 X 中的图形编程最终都会使用 xlib 库。
毫不夸张地说,xlib 非常冗长、神秘且复杂。因此,有很多库(如 SDL (3.10 节) 用于 2D 图形,OpenGL (3.3 节) 用于 3D 图形,以及小部件集 (3.9 节) 用于窗口中的小部件)隐藏了 xlib 编程的不同方面的细节。
虽然有些游戏是用 xlib 编写的,例如 Doom 编辑器 Yadex,但 xlib 本身并不是一个严肃的游戏编写库。大多数游戏不需要 xlib 提供的低级接口。此外,通过使用更高级别的库,游戏编写者可以在多个平台上开发他的游戏,甚至是不使用 XFree86 的平台。
小部件是构成 GUI 应用程序界面的对象。它们包括文本输入框、下拉菜单、滑块条、单选按钮等等。小部件集是相关小部件的集合,这些小部件被设计为具有通用的界面和一致的“感觉”。Gtk 是 Linux 上的规范小部件集,但还有许多其他小部件集,例如 fltk(一个小型 C++ 小部件集)、Xaw、Qt(KDE 的小部件集)和 Motif(Netscape 使用的小部件集)。Motif 曾经是 Unix 世界中小部件集的王者,但授权费用非常昂贵。Open Group 最终为开源操作系统开放了 Motif 的许可,但为时已晚。有许多完全开源的小部件集比 Motif 更完整,看起来也更好,包括 Lesstif,一个完全免费的 Motif 克隆。
SDL <http://www.libsdl.org> 是 Sam Lantiga(UCD 毕业生,耶!)编写的一个库。它实际上是一个元库,这意味着它不仅是一个隐藏 xlib 编程细节的图形库,还为声音、音乐和事件处理提供了一个简单的接口。它采用 LGPL 许可,并提供操纵杆和 OpenGL 支持。与 xlib (3.8 节) 不同,SDL 非常适合游戏编程。
SDL 最引人注目的部分是它是一个跨平台库。除了一些细节之外,用 SDL 编写的程序可以在 Linux、MS Windows、BeOS、MacOS、MacOS X、Solaris、IRIX、FreeBSD、QNX 和 OSF 下编译。有各种人编写的 SDL 扩展,用于处理你可能想到的任何图形格式、播放 mpeg、显示 truetype 字体、精灵处理以及几乎所有东西。SDL 是所有图形库都应努力实现的榜样。
Sam 编写这样一个酷库的背后有一个潜在的动机。他是 Loki Software 的首席程序员(他现在为暴雪软件编码),除了 Quake3 之外,Loki Software 的所有游戏都使用了 SDL。
GGI <http://www.ggi-project.org> 是一个旨在在较低级别的代码中实现图形抽象层、将图形硬件支持放入公共代码库,并为图形应用程序带来更高的稳定性和可移植性的项目。LibGGI 应用程序可以在 SVGAlib、fb 和 X 服务器等上运行。从他们的屏幕截图来看,这是一个非常强大的库。
直接使用 LibGGI 的应用程序包括 Heroes、Ultrapoint、Quake 和 Berlin。大多数使用 SVGALib 的应用程序可以通过使用一个包装器库来在 X 或任何其他 LibGGI 后端上运行,该包装器库使用 LibGGI 重新实现 SVGALib (3.12 节)。SDL (3.10 节) 和 clanlib (3.15 节) 应用程序可以显示在 LibGGI 上,但这些库的本机驱动程序通常更快,但这是使 SDL、clanlib 和 SVGALib 应用程序在以前无法运行的地方运行的好方法。
GGI 有一个姊妹项目 KGI,它正在开发一个内核级的替代方案,以替代像 linux framebuffer 和 DRI 这样的系统。该项目比 LibGGI 本身进展慢得多,但有望结合 DRI 级的速度以及 UNIX 用户期望的稳定性和安全性。
控制台是当你第一次启动计算机时看到的黑色非图形屏幕(并且你没有运行 xdm 或 gdm)。这与具有各种 GUI 元素(如 xterm)的 X 环境相反。一种常见的误解是 X 意味着图形,而控制台意味着没有图形。控制台上肯定有图形——我们将讨论实现此目的的两种最常见方法。
SVGAlib 是一个图形库,允许你在控制台上绘制图形。有许多图形应用程序和游戏使用 SVGAlib,例如 zgv(一个控制台图形图像查看器)、prboom 和 hhexen。我碰巧是这个库和图形控制台游戏的粉丝;它们速度极快、全屏且引人入胜。SVGAlib 有三个缺点。首先,SVGAlib 可执行文件需要由 root 运行或设置为 setuid root,但是,该库在可执行文件开始运行后立即释放 root 状态。其次,SVGAlib 依赖于显卡——如果你的显卡不受 SVGAlib 支持,那你就不走运了。第三,SVGAlib 仅适用于 Linux。用 SVGAlib 编写的游戏只能在 Linux 上运行。
帧缓冲是由图形模式而不是 BIOS 文本模式实现的控制台。为什么要在图形环境中模拟文本模式?这允许我们在控制台中运行图形内容,例如允许我们选择任何我们希望控制台显示的字体(通常由 BIOS 设置)。LDP 提供了一个很好的帧缓冲 HOWTO。使用帧缓冲编写的图形控制台游戏与 SVGA 库有相同的缺点:并非所有硬件都受支持,并且代码只能在 Linux 上运行。
OpenAL <http://www.openal.org> 的目标是成为声音领域的 OpenGL,就像 OpenGL 在图形领域一样。它最初是 Loki Software 和 Creative Labs 之间的合作项目,旨在成为一个厂商中立和跨平台的音频 API——相当于音频领域的 OpenGL(第 3.3 节)。Loki 已经不再运营,但 Creative 和开源社区一直在维护这个项目。它使用 LGPL 许可,并且可以从 OpenAL 网站免费获取规范。它获得了 nVidia 的支持(基于 nForce2/3 的主板带有用于板载音频的 OpenAL MS Windows 库),Apple 已经在其 OSX 的音频框架中添加了 OpenAL,并且它还可以为 Epic Games 的 Unreal Engine 提供支持。
目前,它并非完全跨平台。在 Linux 上几乎没有对 EAX 等增强功能或任何硬件加速的支持,尽管它在 Windows 实现中存在。但是,如果您有 Creative SoundBlaster 或 Audigy 声卡(带有 emu10x 芯片),并且您使用 ALSA 声卡驱动程序,您可以从 http://www.lost.org.uk 获取 OpenAL 库,该库提供硬件加速和不错的环绕声支持。
DirectX 是微软于 1995 年首次开发的一系列专有多媒体 API,用于其各种 Windows 操作系统。说“DirectX 就像 OpenGL”或“DirectX 就像 SDL”是错误的,就像在 DirectX 教程中经常说的那样。多媒体 API 在 Windows 上的集中度高于在 Linux 上的集中度。更准确的说法是“DirectX 就像 DRI、OpenGL 和 SDL 的组合”。截至 2004 年 10 月,DirectX 的最新版本是 9c。DirectX 的组成部分是
DirectDraw 提供对视频内存的直接访问,就像 DRI 一样,因此 2D 图形可以直接 blit 到显卡。DirectDraw 就像 SDL 的图形组件,但直接访问显卡是由 DRI 而不是 SDL 完成的。这就是为什么一个游戏可以很容易地使 Windows 系统崩溃,但不应该使 Linux 系统崩溃。
Direct3D 像 OpenGL 一样,提供了一个 3D 图形 API。OpenGL 是开源的、较低级别的,并且可以在多种操作系统下编译,而 D3D 是专有的、较高级别的,并且只能在 Windows 上编译。D3D 首次出现在 DirectX 2 中,该版本于 1996 年发布。
DirectAudio 是 DirectSound 和 DirectMusic 这两个音频 API 的组合,它允许直接访问声卡以进行声音和音乐播放。
DirectInput 为游戏输入设备(例如操纵杆)提供支持。
DirectPlay 为多人游戏提供简化的网络支持。
DirectShow 提供对电影文件(如 AVI 和 MPG)的支持。它是一个独立于 DirectX 的 API,但已与 DirectX 8 集成。
此 API 提供了一种从应用程序内部安装 DirectX 的方法,以简化游戏安装。
根据您谈论的 DirectX 版本,winex(第 10.5.3 节)中的 DirectX 支持范围从完全支持到“某种程度”支持。wine(第 10.5.1 节)对它的支持很差,vmware(第 10.5.5 节)几乎不支持,而 Win4Lin(第 10.5.4 节)不支持。
关于可移植性的一个评论:DirectX 的每个组件在 Linux 上都有多个对应的库。此外,使用 OpenGL、GGI 或 SDL 等库的游戏编写者将编写一个游戏,该游戏可以很容易地在 Windows、Linux 和其他众多操作系统上编译。然而,游戏公司仍然坚持使用 DirectX,因此将其受众限制为仅 Windows 用户。如果您是一名游戏编写者,请考虑使用跨平台库并远离 DirectX。
一家名为 realtechVR 的公司启动了一个开源项目 DirectX Port <http://www.v3x.net/directx>,就像 wine 一样,它提供了一个 Direct3D 仿真层,用于实现 Direct3D 调用。该项目专注于 BeOS 平台,但现在专注于 MacOS 和 Linux。您可以从他们的 sourceforge 页面获取最新的 cvs,网址为 <http://sourceforge.net/projects/dxglwrap>。
如果你要在 X 下玩游戏,了解一些关于 X 的知识至关重要。“X Window User HOWTO”,尤其是“man XF86Config”是必须阅读的。不要亏待自己;阅读它们。它们具有极高的“信息空间比率”。如果您了解其运作方式,许多问题都可以轻松解决XF86Config(或者XF86Config-4).
无论您是试图诊断 X 问题还是从邮件列表或 Usenet 新闻组请求帮助,您都希望拥有尽可能多的可用信息。以下是一组可用于获取该信息的工具。
关于你的 X 系统的最佳诊断工具和信息来源之一是 probeonly 输出。要使用它,请杀死 X(如果它已经在运行),然后从控制台输入
X -probeonly 2> X.out |
是的,这是一个单独的破折号;标准就这样了。X 的输出会转到 stderr,所以我们必须用 "2>" 将 stderr 重定向到名为X.out的文件。该文件将包含几乎所有关于你的 X 系统的信息。重要的是要知道在 probeonly 输出中会看到的各种标记之间的区别
(--) probed (**) from config file (==) default setting (++) from command line (!!) notice (II) informational (WW) warning (EE) error (??) unknown. |
以下是我从输出中收集的一些信息示例
我以 16 bpp 的颜色运行
(**) TDFX(0): Depth 16, (--) framebuffer bpp 16 |
X 已经检测到我的显卡芯片组和显存
(--) Chipset 3dfx Voodoo5 found (--) TDFX(0): VideoRAM: 32768 kByte Mapping 65536 kByte |
当你的 X 屏幕向右移动得有点太远,或者垂直长度太小而无法适应你的显示器时,xvidtune 是你的朋友。但是,它也是一个很棒的诊断工具。它会给你
在你的 XF86Config 文件中指定的 hsync/vsync 范围
定义你的 videomode 的 4 个水平和 4 个垂直数字(第一个水平/垂直数字给出屏幕分辨率)。这 8 个数字会告诉你 X 使用哪个 modeline。有关更多信息,请参见 XFree86 Video Timings Howto。请注意,不再需要显式 modeline,因为 XFree 4.0.1 及更高版本会根据你的显示器和显卡的功能自动计算 modetimings。但是,有时你可能想要摆弄模式计时,例如用于奇怪的硬件,或者如果你想调整你的显示器。
你的显卡运行的“点时钟”。
在 X 下玩游戏时,你应该考虑在没有窗口管理器 (WM) 的情况下启动 X。重量级 WM(如 Enlightenment)或成熟的桌面环境(如 GNOME 或 KDE)可能会产生明显的减速。即使是轻量级 WM(如 twm)也会占用你的 CPU 时钟周期(并且在 twm 的情况下,即使是全屏游戏也会在窗口周围有一个框架)。在没有 WM 或 DE 的情况下运行游戏取决于你如何访问 X。如果你通常登录到虚拟控制台并使用 "startx" 启动 X,请尝试以下操作
修改~/.xinitrc,它告诉 X 在启动时运行什么。这是我的 .xinitrc 的样子
#quake3 +set r_gldriver libGR.so.1 #exec ut #lsdldoom -server 2 #exec tribes2 exec /usr/bin/enlightenment |
你通常会看到一个窗口或桌面管理器从这个文件中执行(GNOME 或 KDE)。用井号 (#) 注释掉包含 WM 或桌面管理器的行,并将你的游戏放在新的一行上,并带有你想要传递的任何命令行参数。如果游戏不在你的 $PATH 中,请给出其完整路径名。
如果你直接使用 gdm 登录到 X,那么情况会略有不同。这些说明适用于 gdm 2.4 或更高版本。它们*可能*适用于 kde,但我不能确定。
首先,检查你的gdm.conf(通常在/etc/X11/gdm或者/etc/gdm)文件中,查找以 "SessionDesktopDir=blah" 开头的行。作为选项列出的目录之一应该是 "/usr/share/xsessions",并且是在此示例中将使用的目录。作为 root 用户,更改为 "/usr/share/xsessions" 目录并查看其内容。它应该包含一些.desktop文件,每个文件都对应于你将在 gdm 的会话菜单中看到的条目,例如gnome.desktop, enlightenment.destop。此示例将向你展示如何登录到 Doom3。将任何桌面文件复制到 "doom3.desktop" 并在你喜欢的文本编辑器中打开新文件。该文件将充满替代语言,因此删除你不想要的所有内容,并使文件看起来像这样
[Desktop Entry] Encoding=UTF-8 Name=DOOM III Comment=iD's Doom III #if game is not in path, remember to put the full path here Exec=/usr/games/doom3/doom3 # no icon yet, only the top three are currently used Icon= Type=Application |
保存文件并注销你的窗口管理器。在 gdm 登录屏幕上,你应该现在在“会话”中看到 "DOOM III" 作为选项。当然,你可以为你安装的每个游戏添加一个 .desktop 文件
从 Pentium 类处理器开始,包括 Athlon、K6-2 和其他 CPU,都有内存类型范围寄存器 (MTRR),它控制处理器如何访问内存位置范围。基本上,它将许多较小的独立写入视频卡的操作转换为单个写入(突发)。这提高了写入视频卡的效率,并且可以将你的图形速度提高 250% 或更多。
参见/usr/src/linux/Documentation/mtrr.txt了解详细信息。请注意,由于编写了此文件,XFree86 已被修补以自动检测你的视频 RAM 基地址和大小并设置 MTRR。
如果由于某种原因你正在使用 X 3.3,请按照mtrr.txt(参见第 5.1 节)给出的说明设置你的 MTRR。X 4.0 会自动为你执行此操作。
如果你正在 X 下玩游戏,不要运行窗口管理器,当然不要运行像 GNOME 或 KDE 这样的桌面管理器。有关详细信息,请参见第 4.2 节。
通过使用系统上的启动脚本来终止所有非必要的进程(您需要以 root 用户身份执行此操作)。在 Debian 上,运行级别 2 的启动脚本位于 /etc/rc2.d/ 中。您可以通过向其启动脚本发送 `stop' 命令来有序地终止服务。
# cd /etc/rc2.d # ./ntpd stop |
另一个(激进的)选择是简单地将您自己置于单用户模式,使用以下命令:
# telinit 1 |
这甚至会删除 getty 进程;您的系统将只运行对其运行至关重要的进程。您将运行大约 10 个进程。缺点是您必须以 root 用户身份进行游戏。但您的进程表将变成一个空城,所有额外的 CPU 资源将直接用于您的游戏。
在游戏中常见的一个问题是找不到库文件。它们有点神秘,并且有奇怪的名字,所以我们将简要介绍一下 Linux 上的库。有两种类型的库,静态库和动态库。编译程序时,默认情况下,gcc 使用动态库,但是您可以使用-static开关,让 gcc 改用静态库。除非您计划从源代码编译游戏,否则您主要会对动态库感兴趣。
动态库,也称为“共享库”,在应用程序运行时为其提供目标代码。也就是说,代码在运行时链接到可执行文件中,而不是在编译时。它们类似于 Windows 使用的.dll。负责“动态”链接代码的程序称为 /etc/ld.so,动态库本身通常以.so加上版本号结尾,例如
/usr/lib/libSDL.so /lib/libm.so.3 |
使用 gcc 时,您可以通过删除字符串lib, .so和所有版本号来引用这些库。因此,要使用这两个库,您需要向 gcc 传递-lSDL -lm选项。gcc 随后将“在可执行文件中放入一个备忘录”,说明在调用 SDL 或数学函数时查找文件/usr/lib/libSDL.so和/lib/libm.so.3。
与动态库在应用程序运行时提供代码相反,静态库包含在编译程序时链接(插入)到程序中的代码。没有代码在运行时插入;代码是完全独立的。静态库通常以.a加上版本号结尾,例如
/usr/lib/libSDL.a /usr/lib/libm.a |
这些.a文件实际上是许多.o(目标)文件归档在一起的存档,类似于 tar 文件。您可以使用 nm 查看静态库包含哪些函数
% nm /usr/lib/libm.a ... e_atan2.o: 00000000 T __ieee754_atan2 e_atanh.o: 00000000 T __ieee754_atanh 00000000 r half 00000010 r limit 00000018 r ln2_2 ... |
使用 gcc 时,您可以通过删除字符串“lib”、“.a”和所有版本号来引用这些库。因此,要使用这两个库,您需要向 gcc 传递-lSDL -lm选项。gcc 随后将在编译过程中看到数学函数时“连接”来自/usr/lib/SDL.a和/usr/lib/libm.a的代码。
如果您编译自己的游戏,那么库方面的最大问题是 gcc 找不到静态库,或者您的系统上根本不存在该库。当运行二进制游戏时,您的库问题将是 ld.so 找不到该库,或者您的系统上根本不存在该库。因此,讨论一下 gcc 和 ld.so 最初是如何查找库的,是有意义的。
gcc 在“标准系统目录”以及您使用-L选项指定的任何目录中查找库。您可以使用 gcc -print-search-dirs 找到这些标准系统目录。
ld.so 在名为/etc/ld.so.cache的文件中包含的二进制哈希表中查找包含可用动态库的目录列表。由于它包含二进制数据,因此您无法直接修改此文件。但是,该文件是从文本文件/etc/ld.so.conf生成的,您可以编辑它。此文件包含您希望 ld.so 搜索动态库的目录列表。如果您想开始将动态库放在/home/joecool/privatelibs中,您需要将此目录添加到/etc/ld.so.conf。您的更改实际上不会生效到/etc/ld.so.cache,直到您运行 ldconfig;一旦运行,ld.so 将开始在您的私有目录中查找库。
此外,即使您只是向系统添加了额外的库,也必须更新ld.so.cache以反映新库的存在。
大多数商业 Linux 游戏将动态链接到各种 LGPL 库,例如 OpenAL 或 SDL。对于这些示例,将使用 Bioware 的 NeverWinter Nights <http://nwn.bioware.com>。
要找出游戏使用的库,我们可以使用 “ldd” 命令。Cd 到/usr/games/nwn,或者您安装它的任何位置,然后查看这些文件。您应该看到一个名为nwmain的文件;这是实际的游戏二进制文件。键入 “ldd nwmain”,您将看到
$ ldd nwmain linux-gate.so.1 => (0xffffe000) libm.so.6 => /lib/libm.so.6 (0x40027000) libpthread.so.0 => /lib/libpthread.so.0 (0x40049000) libGL.so.1 => /usr/lib/libGL.so.1 (0x4009b000) libGLU.so.1 => /usr/X11R6/lib/libGLU.so.1 (0x40103000) libmss.so.6 => not found libSDL-1.2.so.0 => /usr/lib/libSDL-1.2.so.0 (0x40178000) libc.so.6 => /lib/libc.so.6 (0x401ff000) /lib/ld-linux.so.2 (0x40000000) libGLcore.so.1 => /usr/lib/libGLcore.so.1 (0x40319000) libnvidia-tls.so.1 => /usr/lib/libnvidia-tls.so.1 (0x409f1000) libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x409f3000) libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x40a01000) libdl.so.2 => /lib/libdl.so.2 (0x40acd000) libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x40ad1000) libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x40b88000) libasound.so.2 => /usr/lib/./libasound.so.2 (0x40b90000) |
ldd 显示动态可执行文件依赖的所有库,并显示它们的位置。它还会“拉入”依赖项的依赖项。例如,虽然 NWN 本身不依赖于libnvidia-tls.so,但我系统上 Nvidia 提供的 libGL 依赖于它。
缺少库?
在上面的示例中,我们可以看到nwmain想要libmss.so.6,但链接器找不到它。通常,缺少库意味着崩溃即将发生。但还有另一件事需要考虑:大多数游戏实际上是由“包装器”启动的,这是一个在启动游戏之前执行一些魔法的 shell 脚本。在 NWN 的情况下,包装器称为nwn。现在让我们来看看它
$ less nwn #!/bin/sh # This script runs Neverwinter Nights from the current directory export SDL_MOUSE_RELATIVE=0 export SDL_VIDEO_X11_DGAMOUSE=0 # If you do not wish to use the SDL library included in the package, remove # ./lib from LD_LIBRARY_PATH export LD_LIBRARY_PATH=./lib:./miles:$LD_LIBRARY_PATH ./nwmain $@ |
此脚本设置一些环境变量,然后使用我们添加的任何命令行选项启动游戏二进制文件。这里相关的部分是名为“LD_LIBRARY_PATH”的环境变量。这是一种添加到链接器搜索路径的方法。尝试将该行复制到您的 shell,然后看看重新运行 ldd 时会发生什么。
$ export LD_LIBRARY_PATH=./lib:./miles:$LD_LIBRARY_PATH $ ldd nwmain linux-gate.so.1 => (0xffffe000) libm.so.6 => /lib/libm.so.6 (0x40027000) libpthread.so.0 => /lib/libpthread.so.0 (0x40049000) libGL.so.1 => /usr/lib/libGL.so.1 (0x4009b000) libGLU.so.1 => /usr/X11R6/lib/libGLU.so.1 (0x40103000) libmss.so.6 => ./miles/libmss.so.6 (0x40178000) libSDL-1.2.so.0 => ./lib/libSDL-1.2.so.0 (0x401ec000) libc.so.6 => /lib/libc.so.6 (0x4025e000) /lib/ld-linux.so.2 (0x40000000) libGLcore.so.1 => /usr/lib/libGLcore.so.1 (0x40378000) libnvidia-tls.so.1 => /usr/lib/libnvidia-tls.so.1 (0x40a50000) libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x40a52000) libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x40a60000) libdl.so.2 => /lib/libdl.so.2 (0x40b2c000) libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x40b30000) libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x40be7000) |
正如您所看到的,这给了我们略微不同的结果。NWN 库目录已添加到搜索路径的前面,因此现在链接器可以在 “libmss.so.6./miles” 目录中找到,并且首先找到 libSDL 的本地副本,不再使用系统副本。
这些脚本还有另一个好处:它们很容易编辑,允许您提供自己的库副本。任何游戏提供的库副本,例如 OpenAL 或 SDL,都很可能针对最低的公分母编译,可能是 i486 或 i686。如果您有 Pentium4 或 AthlonXP,您可以专门为您的处理器编译您自己的版本。编译器将尝试优化生成的二进制文件,从而提高一些性能。有关更多信息,请访问 GCC 网站 the GCC site.。
使 NWN 使用您的系统副本很容易。包装器脚本中已经说明!从LD_LIBRARY_PATH行中删除 "./lib:",就可以了。
另一个不错的小技巧是针对使用 OpenAL 进行声音输出的游戏(例如,基于 Unreal 的游戏:UT、Postal、Rune 等)。由于 Open Sound System (OSS) 已被弃用,转而支持 ALSA,因此我看到的所有 Linux 发行版现在都默认提供 ALSA 支持,而 OSS 支持实际上是通过 ALSA 的兼容性模块提供的。与游戏一起分发的openal.so副本通常不支持 ALSA,因此使游戏使用您自己编译的副本将允许您以原生方式使用 ALSA。
当然,我们无法涵盖发生的每件坏事,但我将概述一些常识。
有两种类型的坏事:随机的和可重复的。当您无法控制它们何时发生时,很难诊断或修复随机问题。但是,如果问题是可重复的“当我按两次向左箭头键时发生”,那么您就成功了。
阅读友好的手册。“手册”可以采用几种形式。对于开源游戏,有随游戏提供的 readme 文件。商业游戏将有印刷的手册,可能还有游戏随附的 CD 上的 readme 文件。不要忘记浏览游戏随附的 CD 以获取有用的提示和建议。
不要忘记游戏的网站。游戏的作者可能已经多次见过与您完全相同问题的人,并且可能会在网站上发布特定于该游戏的信息。Loki Software 在 http://faqs.lokigames.com 上的在线常见问题解答就是一个很好的例子。
如果您正在玩您编译的开源游戏,请务必通过查看游戏网站来确保您拥有最新版本。如果您的游戏来自发行版,请确保没有游戏的更新 rpm/deb。
像 Loki 这样的商业游戏公司会发布游戏的补丁。通常,游戏会有很多补丁(Myth2),有些游戏没有这些补丁就无法玩(Heretic2)。无论您在运行游戏时遇到问题与否,请查看游戏的网站以获取补丁;可能存在您甚至没有意识到的安全问题的更新。
顺便说一句,Loki 现在有一个实用程序,可以搜索您硬盘上的 Loki Software 并自动更新它们。请查看 http://updates.lokigames.com。
如果您不知道什么是 netnews (Usenet),那么这绝对值得您花 30 分钟来学习。安装新闻阅读器。我更喜欢控制台工具,所以我使用 tin,但 slrn 也很受欢迎。Netscape 也有一个漂亮的图形“点击式”新闻阅读器。
例如,我可以使用 tin -g news.lokigames.com 浏览 Loki Software 的新闻服务器。您也可以使用$NNTP环境变量或使用文件/etc/nntpserver.
发布到 Usenet 的每篇文章都会存档在 Google 的数据库中,网址为 http://groups.google.com。此存档过去位于 http://www.deja.com,但已被 Google 收购。许多人仍然将该存档称为“deja”。
几乎可以肯定的是,无论您在 Linux 上遇到什么问题,无论是与游戏相关的还是不相关的,都已经有人在 Usenet 上询问并回答过了。不是一次,不是两次,而是多次。如果您不理解您看到的第一个回复(或者如果它不起作用),请尝试其他许多回复之一。如果该页面不是您能理解的语言,则有许多翻译站点会将文本转换为您喜欢的任何语言,包括 http://www.freetranslation.com 和 http://translation.lycos.com。我选择的网络浏览器 Opera(可在 http://www.opera.com 获取)允许您使用鼠标右键选择一部分文本,然后单击左键将所选内容翻译成另一种语言。当 Google 群组搜索产生一个看起来有用但我的妻子(她精通德语)不在身边的德语页面时,这非常有用。
Google 群组搜索具有基本和高级搜索页面。不要理会简单的搜索。高级搜索位于 http://groups.google.com/advanced_group_search。
使用起来非常简单。例如,如果我的问题是 Lucy 跳跃时 Quake III 总是崩溃,我会在“查找包含所有单词的消息”文本框中输入“linux quake3 crash lucy jumps”。
有一些字段可以让你缩小搜索范围到特定的新闻组。花时间阅读并理解每个字段的含义。我保证你不会对这项服务感到失望。 使用它,你会成为一个更快乐的人。 请注意,他们不存档私人新闻组,例如 Loki Software 的新闻服务器。 但是,由于太多人使用 Usenet,这几乎无关紧要。
通常你不会为商业游戏做这些。对于开源游戏,你可以通过提供 core 文件或堆栈跟踪来帮助作者。简单来说,core 文件(也称为 core dump)是一个文件,它保存了程序崩溃时的“状态”。 它为程序员提供了关于崩溃性质的宝贵线索 -- 导致崩溃的原因以及程序发生崩溃时正在做什么。 如果你想了解更多关于 core 文件的信息,我在 http://www.dirac.org/linux 上有一个很棒的 gdb 教程。
至少,作者会对游戏崩溃时的调用堆栈感兴趣。以下是如何在崩溃时获取调用堆栈:
有时发行版会设置他们的操作系统,以便不生成 core 文件(主要对程序员有用)。 第一步是让你的系统允许无限的 core 文件大小:
ulimit -c unlimited |
现在你必须重新编译程序并将 -g 选项传递给 gcc(解释这一点超出了本文档的范围)。现在,运行游戏并做任何导致程序崩溃的操作,再次 dump 一个 core 文件。使用 core 文件作为第二个参数运行调试器:
$ gdb CoolGameExecutable core |
在 (gdb) 提示符下,键入 "backtrace"。 你会看到类似这样的东西:
#0 printf (format=0x80484a4 "z is %d.\n") at printf.c:30 #1 0x8048431 in display (z=5) at try1.c:11 #2 0x8048406 in main () at try1.c:6 |
它可能很长,但使用你的鼠标剪切并粘贴此信息到一个文件中。 给作者发电子邮件并告诉他:
游戏的名称
游戏崩溃时屏幕上出现的任何错误消息。
导致崩溃的原因以及它是否是可重复的崩溃。
调用堆栈
如果你有好的带宽,询问作者是否需要他的程序 dump 的 core 文件。 如果他说需要,那就发送它。 记得先询问,因为 core 文件可能非常非常大。
如果你的游戏允许保存游戏,那么向作者发送一个保存游戏的副本是有用的,因为它有助于技术人员重现出错的地方。 对于商业游戏,此选项比发送 core 文件或调用堆栈更有成效,因为商业游戏无法重新编译以包含调试信息。 你绝对应该在发送保存游戏文件之前询问,因为它们往往很长,但游戏公司通常拥有大量的带宽。 Mike Phillips(前 Loki Software 的员工)提到,向 Loki 发送保存的游戏绝对是一件好事。
不用说,这仅适用于你的游戏在某个特定点可重复崩溃的情况。 如果游戏每次运行时都会发生段错误,或者速度慢得令人难以置信,那么保存游戏文件就没什么帮助了。
有时你会看到错误消息,表明找不到某个文件。 该文件可能是一个库:
% ./exult ./exult: error while loading shared library: libSDL-1.2.so.0: cannot load shared object file: No such file or directory |
或者它可能是一些数据文件,例如:wad或者地图文件。
% qf-client-sdl IP address 192.168.0.2:27001 UDP Initialize Error: W_LoadWadFile: couldn't load gfx.wad |
假设gfx.wad已经在我的系统上,但找不到,因为它不在正确的目录中。 那么正确的目录在哪里? 如果知道这些程序在何处寻找丢失的文件,那不是很有帮助吗?
这就是 strace 的闪光点。 strace 告诉你正在进行哪些系统调用,使用什么参数,以及它们的返回值是什么。 在我的“内核模块编程指南”(即将发布到 LDP)中,我概述了你可能想知道的关于 strace 的所有内容。 但是,这是一个简要的概述,使用了 strace 看起来像什么的典型例子。 给出命令:
strace -o ./LS_LOG /bin/ls |
"-o" 选项将 strace 的输出发送到一个文件;这里是 LS_LOG。 strace 的最后一个参数是我们要检查的程序,这里是 "ls"。 查看 LS_LOG 的内容。 令人印象深刻,不是吗? 这是一个典型的行:
open(".", O_RDONLY|O_NONBLOCK|0x18000) = 4 |
我们使用了open()系统调用来打开带有各种参数的 ".",并且调用的返回值是 4。 这与找不到文件有什么关系?
假设我想观看 StateOfMind 演示,因为我似乎永远也看不够它。有一天我尝试运行它,但发生了一些不好的事情:
% ./mind.i86_linux.glibc2.1 Loading & massaging... Error:Can't open data file 'mind.dat'. |
让我们使用 strace 来找出程序在何处寻找数据文件。
strace ./mind.i86_linux.glibc2.1 2> ./StateOfMind_LOG |
调出 vim 并搜索所有出现的mind.dat,我找到以下行:
open("/usr/share/mind.dat",O_RDONLY) = -1 ENOENT (No such file) write(2, "Error:", 6Error:) = 6 write(2, "Can\'t open data file \'mind.dat\'."..., ) = 33 |
它正在寻找mind.dat在唯一的目录下。 显然,mind.dat不在/usr/share中。 现在我们可以尝试定位mind.dat并将其移动到/usr/share中,或者更好的是,创建一个符号链接。
这种方法也适用于库。 假设库libmp3.so.2在/usr/local/include中,但你的新游戏“Kill-Metallica”找不到它。 你可以使用 strace 来确定 Kill-Metallica 在何处寻找该库,并从/usr/local/include/libmp3.so.2创建一个符号链接到 Kill-Metallica 寻找该库文件的任何地方。
strace 是一个非常强大的实用程序。 当诊断为什么找不到东西时,它是你最好的盟友,甚至比查看源代码更快。 最后需要注意的是,你无法在 Lokisoft 或 Tribsoft 的商业游戏的源代码中查找信息。 但是你仍然可以对它们使用 strace!
有时,游戏会异常退出,你的控制台会被“损坏”。 损坏的控制台有几个定义。 文本字符可能看起来像乱码。 你通常漂亮的黑色屏幕可能看起来像一个准图形屏幕。 当你按下 ENTER 时,换行符不会回显到屏幕上。 有时,键盘上的某些键不会响应。 注销并重新登录并不总是有效,但有一些方法可能会起作用:
如果你在输入时没有在屏幕上看到任何字符,则你的终端设置可能不正确。 尝试 "stty echo"。 这应该让输入的字符再次回显。
在提示符下,键入 "reset"。 这应该可以解决许多问题,包括被基于 SVGAlib 或 ncurses 的游戏损坏的控制台。
尝试再次正常运行游戏。 有一次我必须赶紧杀死 Quake III,所以我执行了一个 Ctl-Alt-Backspace。 控制台被一个准图形屏幕损坏了。 运行 Quake III 并正常退出解决了这个问题。
命令 deallocvt 和 openvt 将适用于你遇到的大多数其他问题。 deallocvt N 完全终止终端N, 以至于Alt-FN甚至不再有效。 openvt -c N 重新启动它。
如果键盘上的某些键不起作用,请发挥创造力。 如果你想重新启动但 `o' 键不起作用,请尝试使用 halt。 我想出的一种方法是在提示符下键入一个命令,并使用屏幕上的字符进行鼠标剪切/粘贴。 例如,你可以键入 "ps ax",并且你肯定会在屏幕上的某个地方找到 `h'、`a'、`l' 和 `t'。 你可以使用鼠标剪切并粘贴单词 "halt"。
最令人遗憾的选择是重新启动。 如果可以,最好是按顺序关闭;使用 "halt" 或 "shutdown"。 如果你不能,从另一台机器 ssh 进入。 当你的控制台严重损坏时,有时会起作用。 在最坏的情况下,按下重置或电源开关。
请注意,如果你使用日志文件系统,例如 ext3、reiserfs 或 xfs,那么按下电源开关并不是那么糟糕。 你仍然应该按顺序关闭,但文件系统的完整性将得到维护。 你通常不会看到使用日志文件系统的分区的 fsck。
当一台计算机“锁定”(也称为“挂起”)时,键盘和鼠标会变得完全没有响应。 这是 Linux 内核中的一个 bug 的直接后果。 虽然 Linux 以稳定性而闻名,但这些事情确实会发生,尤其是对于游戏而言,游戏需要高度同步的硬件事件,这些事件发生得非常快,甚至对于计算机而言。 当计算机锁定时,它可能是“硬锁定”,这意味着内核已完全停止运行。 这通常表明硬件行为不当或存在故障。 除了按下重置或电源按钮外,无法从此类锁定中恢复。 锁定也可能是“软锁定”,这意味着内核仍在某种程度上运行。 可以从容地从中恢复。
你应该尝试的第一件事是按下control-alt-backspace这将终止 X。如果你获得对系统的控制,则内核实际上从未被锁定。 如果在几秒钟后这不起作用,你肯定需要使用以下说明重新启动系统。
使用control-alt-delete重新启动系统。 如果你在几秒钟后听到计算机发出蜂鸣声(这是 BIOS 在开机周期中说“我很好”),你就会知道它有效。
登录到另一个系统并 ssh 进入挂起的系统。 如果你可以 ssh 进入,请重新启动或停止系统。
如果你无法 ssh 进入系统,你将需要使用“魔法 SysRq 键”,该键在/usr/src/linux/Documentation/sysrq.txt中进行了记录。 这是 x86 架构的摘要(请参阅其他架构的文档)。 请注意,如果你的键盘没有 SysRq 键,请使用 PrintScreen 键
按下alt-SysRq-s。 这将尝试同步你挂载的文件系统,以便将对文件的更改刷新到磁盘。 你可能会听到磁盘活动。 如果你正在查看控制台,系统应该打印出被刷新的设备。
几秒钟后,按下alt-SysRq-u这将尝试以只读方式重新挂载所有已挂载的文件系统)。您应该能听到磁盘活动的声音。如果您正在查看控制台,系统将打印重新挂载的设备。
几秒钟后,使用Alt-SysRq-b重启系统。
您可以按下Alt-SysRq-h获取非常简洁的帮助屏幕。
要使用魔术 SysRq 键,您的内核需要编译时启用魔术 SysRq 支持。您可以在 "内核黑客 | 内核调试 | 魔术 SysRq 键" 在您喜欢的任何内核配置菜单下找到此选项。如果魔术 SysRq 键序列不能正常关闭您的系统,那么您的内核已经严重崩溃,您需要使用重置或电源按钮来恢复。
很久以前,位于加利福尼亚州圣何塞的一家名为 3dfx Interactive 的公司是游戏显卡市场的王者。1996 年 10 月,他们发布了 Voodoo I,获得了巨大的成功。它是第一块硬件加速卡,但只能渲染 3D;必须与 2D 显卡背靠背连接。想法是由高质量的 2D 显卡(当时 Matrox 非常流行)处理 2D 渲染,但 3D 信息(参见 Glide2,第 3.1 节)将传递给 Voodoo I 并进行渲染,使用 Voodoo 快速的硬件执行必要的图形计算。他们在 1996 年 4 月发布了 Voodoo Rush。它本应该是一张更强大的卡,拥有 50MHz 的 GPU 和 8MB 的 RAM。更好的是,这是他们的第一张 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 不等。有 TV-out 版本。有 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 只是简单地添加更多更快的 RAM。Voodoo IV 和 V 以完整的 32bpp 颜色渲染,具有出色的 AA 支持(第 7.4.3 节),具有第二个 GPU,更多的内存,并且可以说是显卡之王。但是,3dfx 迟迟发布 Voodoo IV 和 V,加上 GeForce 的价格只有一半,这意味着 3dfx 正在迅速沉没。对于 Linux 来说,最新的 Voodoo 只能以 16 位和 24 位颜色加速。更糟糕的是,Voodoo V 的第二个 GPU 没有被 Linux 驱动程序使用(直到今天,Voodoo V 在 Linux 上的功能与单个 GPU Voodoo IV 相当)。大多数 Windows 用户都转向了 nVidia,尽管 nVidia 驱动程序是专有的,但即使是 Linux 用户也开始加入 nVidia 的阵营。VA Linux,最大的 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 的消亡非常突然,是对开源社区的打击。我仍然记得我的朋友 Gabe Rosa 发邮件给我,只写了 "看看 /。" 并看到了这条新闻。这是 Linux 游戏界第二糟糕的一天(第一天是 Loki 的消亡)。这也是一种耻辱。3dfx 正准备发布一款新的 Voodoo V,该显卡配备 4 个 GPU,将击败 ATI 和 nVidia 的产品,以及一款代号为 "Rampage" 的新显卡,据报道它将使他们牢固地重新成为山丘之王。有报道称,Rampage 的技术(已出售给 nVidia)进入了 GeForce 5900。对于 3 年前的技术来说,这还不错!
起初,事情仍然很简单。Linux 游戏玩家要么保留他们的开源 Voodoo,要么获得开源 Radeon 或闭源 GeForce。然而,随着更大更好的游戏的出现,Voodoo 不再是现代游戏的可行显卡只是时间问题。人们仍然在使用 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。
nVidia 的最新产品是 GeForce 5900,基于 NV35 芯片组。它在 Linux 上得到了很好的支持,具有高质量但专有的驱动程序。nVidia 使用了一种方便的组合驱动程序架构;他们的驱动程序将支持 TNT 2 一直到 GeForce 5900。尽管他们的驱动程序是闭源的,但作为一家公司,nVidia 一直支持 Linux 用户并对 Linux 用户很好。
ATI 与 Linux 开发者合作,为他们的 Radeon 提供支持,直到包括 Radeon 9200,后者在 XFree86 中具有 2D 和 3D 支持。我不太确定这些开源驱动程序的质量如何,但是,在第一代 Radeon 下,财富战士 I 和重金属仍然存在不透明的纹理问题。除了 9200 之外,您需要使用 ATI 网站提供的仅二进制专有驱动程序,采用 rpm 格式。据称这些驱动程序非常糟糕;我的一个朋友声称他的 GeForce 4400 的性能优于他的 Radeon 9700 pro。这太可耻了。
在纸面上,在 Windows 基准测试中,Radeon 9800 击败了设计不佳的 GeForce 5800,并略微领先于 GeForce 5900。在纸面上,它只是一张更令人印象深刻的卡。但同样,驱动程序问题使得此信息对我们不可用。如果您一心想购买 Linux 的最佳显卡,您会想要选择 GeForce 5900。
去年的答案非常困难,但这是我目前的看法
所有 GeForce 卡都需要一个专有驱动程序,该驱动程序将 "污染" 您的内核。但是,Radeon 9200 之外的所有 ATI 卡也都需要一个专有驱动程序,该驱动程序也将 "污染" 您的内核。
nVidia 已经证明他们足够关心 Linux,可以为 Linux 编写和维护当前和非常高质量的驱动程序。即使 ATI 开源了其显卡驱动程序,他们也玩了 "我们将让 Linux 开发者为我们编写驱动程序" 的游戏。他们当前的专有驱动程序低于标准。
Radeon 9800 在基准测试和卡规格中勉强击败了 GeForce 5900,但 Linux 用户不会因此受益,因为驱动程序问题......
ATI 有很长的尽快放弃对硬件支持的历史。
在 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 版本更合理。
我们将介绍显卡和 3D 图形术语。这些材料对于实际让游戏运行并不是至关重要的,但可能有助于决定哪些硬件和软件选项最适合您。
抗锯齿是平滑渲染的曲线或多边形边缘的锯齿状效果。像素是矩形对象,因此用像素绘制倾斜的线条或曲线会导致“阶梯”效应,也称为“锯齿”。当像素使得原本应该是平滑的曲线或线条变得锯齿状时,就会出现这种情况。AA 使用 CPU 密集型过滤来平滑这些锯齿状边缘。这可以改善游戏的视觉效果,但也会显着降低性能。
AA 用于多种情况。例如,当您放大图片时,您会注意到曾经平滑的线条变得锯齿状(使用 The Gimp 试试)。字体渲染是 AA 的另一个重要应用。
AA 可以由应用程序本身完成(如 The Gimp 或 XFree86 字体系统),也可以由硬件完成(如果您的显卡支持)。由于 AA 是 CPU 密集型的,因此最好在硬件中执行它,但如果我们在谈论半静态应用程序(如 The Gimp),这实际上不是问题。对于动态情况(如游戏),在硬件中执行 AA 至关重要。
FSAA 通常涉及在单独的帧缓冲区中绘制整个屏幕的放大版本,对整个图像执行 AA,然后将其缩放回正常分辨率。正如您可以想象的那样,这是极其 CPU 密集型的。您永远不会看到非硬件加速的 FSAA。
Mip mapping 是一种技术,其中同一纹理的多个缩放副本存储在显卡内存中,以表示不同距离处的纹理。当纹理很远时,会使用较小的纹理版本(mip map)。当纹理很近时,会使用较大的纹理版本。Mip mapping 可以独立于过滤方法使用(章节 7.4.6)。Mip mapping 减少了内存带宽需求,因为图像在硬件中,而且它还提供了更好的渲染图像质量。
纹理过滤是呈现精美 3D 图形所需的基本功能。它用于多种目的,例如使相邻纹理平滑混合以及使从一定角度查看的纹理(想想从极端角度看广告牌)看起来逼真。有几种常见的纹理过滤技术,包括点采样、双线性、三线性和各向异性过滤。
当我谈论“性能损失”时,请记住,性能损失取决于您运行的分辨率。例如,在低分辨率下,使用三线性过滤代替双线性过滤可能只会产生非常轻微的损失。但在高分辨率下,性能损失可能非常巨大。此外,我不知道有任何卡使用各向异性纹理过滤。TNT 驱动程序声称他们这样做,但我读到这些驱动程序在实际将图像渲染到屏幕时仍然使用三线性过滤。
点采样现在很少见,但是如果您运行一个使用“软件渲染”的游戏(如果您在没有 3D 加速板的情况下运行 3D 加速游戏,则需要这样做),您很可能会看到它被使用。
双线性过滤是一种计算成本低但质量较低的纹理过滤。它通过采样四个最近的(上方、下方、左侧和右侧)纹素的颜色来近似纹理之间的间隙。所有现代 3D 加速显卡都可以在硬件中执行双线性过滤,而不会产生性能损失。
Z 缓冲区是 RAM 的一部分,它表示观看者(您)与对象的每个像素之间的距离。许多现代 3D 加速卡在其显存中都有一个 Z 缓冲区,这大大加快了速度,但是 Z 缓冲也可以由应用程序的渲染引擎完成。但是,在任何可能的情况下,这种事情显然应该在硬件中完成。
每个对象都有一个堆叠顺序,就像一副牌一样。当对象被渲染到 2D 帧缓冲区时,渲染引擎通过使用 Z 缓冲区来移除隐藏的表面。有两种方法可以做到这一点。愚蠢的引擎首先绘制远处的对象,最后绘制近处的对象,从而遮盖 Z 缓冲区中低于它们的物体。智能引擎计算出哪些部分的对象将被它们上面的对象遮挡,并且简单地不渲染您看不到的部分。对于复杂的纹理,这大大节省了处理器的工作。
我所说的“最好”是指最适合游戏。游戏玩家希望我们的游戏拥有高质量的声音,并且减少调整。另一方面,音乐家对“最佳声卡”的含义会有非常不同的概念。如果您是音乐家,您可能想查看 Linux 音频质量 HOWTO。
既然 Linux 开始成熟,这个问题就不像以前那么重要了。很久以前,没有板载 MIDI 芯片的声卡(大多数 PCI 声卡)无法进行 MIDI。这主要是像 xdoom 或 lxdoom 使用 musserv 这样的问题。现在我们有像 Timidity 这样的 MIDI 模拟器和像 SDL 这样的库,它们不需要硬件 MIDI 支持。坦率地说,我已经有很多卡了,但我无法区分它们在游戏方面的任何区别。如果您想做诸如将唱片 LP 转换为数字格式之类的事情,那么您选择带有专业级 A/D 转换器的声卡绝对至关重要。对于此 HOWTO,我们将假定您更像是一名游戏玩家,而不是工作室录音工程师。
您的决定应该基于什么最容易配置。如果您已经有了一张卡并且运行良好,那就足够了。如果您想购买声卡,请购买一张您只需几秒钟即可配置的声卡。PCI 卡比 ISA 卡更容易处理,因为您不需要告诉它们的驱动程序要使用哪些系统资源(IRQ、DMA、I/O 地址)。一些 ISA 卡是即插即用的,例如 Creative AWE-64,并且 Linux 内核在自动配置它们方面已经取得了长足的进步。
我个人的建议是任何带有 es1370 或 es1371 芯片的卡,它在 Linux 上使用 es1370 和 es1371 声音驱动程序。这些卡包括较旧的 Ensoniq es1370 和较新的 Creative PCI-128。这些卡非常便宜且易于在 Linux 下工作。
我曾经是 Creative Soundblaster AWE 32、AWE 64 和 AWE 64 gold 声卡的粉丝。这些 ISA PnP 卡受到 OSS 和 Alsa 的良好支持。它们都使用相同的 E-mu 8000 合成芯片,这使它们能够同时播放 32 个声音(它们有 32 个“通道”)。一些注意事项:首先,Soundblaster AWE HOWTO 已经非常过时。其次,AWE 64 和 AWE 64 gold 可以同时播放 64 个声音,但这是在软件中完成的。Creative 从未发布这些卡的 Linux 驱动程序(并且他们从未向 Linux 开发人员发布编程信息),因此 Linux 用户无法使用 AWE 64 和 AWE 64 gold 上的额外 32 个通道。就 Linux 用户而言,所有三张卡都是完全相同的(尽管 AWE 64 gold 具有镀金连接器,这比更常见的钢制连接器更能提高音质)。
Creative Soundblaster Live! 是当今极其流行的 PCI 声卡。我从来没有拥有过一张,所以无法在此处发表评论。但是,已经有大量关于 Live! 和使用 686b 南桥的 AMD 主板出现严重问题的报告。谷歌搜索应该会找到很多关于这个问题的信息。
一个更相关的问题是扬声器,但即使在这里差异也不大。我曾经拥有昂贵的 Altec Lansing 扬声器,其性能仅比便宜的扬声器略好。你得到你所支付的扬声器,但不要期望有很大的差异。您需要购买带有单独的低音炮的东西;这确实会产生影响,但代价是额外的电源和连接线。
首先,这可能不是游戏的问题,可能是您的设置问题。据我所知,有 3 种方法可以在 Linux 下配置声卡:Linux 内核附带的免费 OSS 声音驱动程序、Alsa 驱动程序和商业 OSS 声音驱动程序。就个人而言,我更喜欢免费的 OSS 驱动程序,但许多人喜欢 Alsa。当您使用免费方法无法使您的声卡工作时,商业 OSS 驱动程序会很好。不要轻视它们;它们非常便宜(比如 10 或 20 美元),支持最前沿的声卡,并且可以消除配置过程中的大量猜测。
您的声音系统可能会出现 5 个问题
共享中断
驱动程序配置错误
有东西已经在访问声卡
您正在使用错误的驱动程序
权限问题
首先要做的是弄清楚您是否存在 IRQ 冲突。ISA 卡不能共享中断。PCI 卡可以共享中断,但某些类型的高带宽卡根本不喜欢共享,包括网络卡和声卡。要找出您是否存在冲突,请执行以下操作cat /proc/interrupts。我的系统上的输出是
$ cat /proc/interrupts CPU0 CPU1 0: 24185341 0 XT-PIC timer 1: 224714 0 XT-PIC keyboard 2: 0 0 XT-PIC cascade 5: 2478476 0 XT-PIC soundblaster 5: 325924 0 XT-PIC eth0 11: 131326 0 XT-PIC aic7xxx 12: 2457456 0 XT-PIC PS/2 Mouse 14: 556955 0 XT-PIC ide0 NMI: 0 0 LOC: 24186046 24186026 ERR: 1353 |
第二列之所以存在,是因为这台机器上有2个CPU;如果您只有一个CPU(称为UP,即单处理器),您将只有1个CPU列。左边的数字是分配的IRQ,右边的字符串指示分配给该IRQ的设备。您可以看到我的声卡 (soundblaster) 和网卡 (eth0) 之间存在 IRQ 冲突。它们都共享 IRQ 5。实际上,我特意构造了这个例子,是为了向您展示 IRQ 冲突是什么样的。但如果我真的有这个冲突,我的网络和声音都无法正常工作(或根本无法工作!)。
如果我的声卡是 PCI 卡,解决此问题的首选方法是简单地将其中一张卡移动到不同的插槽,并希望 BIOS 能够解决问题。更高级的解决方法是进入 BIOS 并将 IRQ 分配给特定插槽。现代 BIOS 具有此功能。
有时,卡会被硬连接为使用特定的 IRQ。您只能在 ISA 卡上看到这种情况。或者,可以使用卡上的跳线将某些 ISA 卡设置为使用特定的 IRQ。对于这些类型的卡,您需要将正确的 IRQ 和内存访问,“I/O 端口”传递给驱动程序。
这是一个特定于声卡的问题,超出了本 HOWTO 的范围。
也许某个应用程序已经在访问您的声卡。例如,也许您有一个暂停的 MP3 播放器?如果某个程序已经在访问您的卡,其他应用程序将无法访问。即使它被编写为在应用程序之间共享卡,我发现 esd(enlightenment 声音守护进程)有时无法正常工作。这里最好的工具是 lsof,它可以显示哪些进程正在访问文件。您的声卡由以下内容表示/dev/dsp。现在,我正在使用 mp3blaster 听 MP3(当然不是 Metallica MP3……)。
# lsof /dev/dsp COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME mp3blaste 1108 p 6w CHR 14,3 662302 /dev/dsp |
fuser 类似;但它允许您向访问设备文件的任何进程发送信号。
# fuser -vk /dev/dsp USER PID ACCESS COMMAND /dev/dsp root 1225 f.... mp3blaster root 1282 f.... mp3blaster |
发出此命令后,mp3blaster 被 SIGKILL 杀死。请参阅 lsof 和 fuser 的手册页;它们非常有用。哦,您需要以 root 身份运行它们,因为您将要请求可能由 root 拥有的进程的信息。
只有两种方法可以配置您的卡
支持必须直接编译到内核中
您必须将正确的驱动程序加载到内存中
您可以通过执行 "lsmod" 或查看 "dmesg" 的输出来找出您的声卡正在使用哪个驱动程序。由于声音对我来说至关重要,所以我总是将声音编译到我的内核中。如果您没有加载驱动程序,则需要弄清楚已编译到您的内核中的内容。这不是很简单。最好的办法是编译您的内核。顺便说一句,让我说一下,编译您自己的内核是精通 Linux 的第一步。第一次做的时候很痛苦,但是一旦你正确地做了,它就会变得非常容易,特别是如果您保留了所有旧的 .config 文件并利用了诸如 "make oldconfig" 之类的东西。有关详细信息,请参阅 Kernel HOWTO。
如果您还没有自己编译内核,那么您的系统很可能设置为将声音驱动程序作为模块加载。这就是发行版做事的方式。将所有东西都编译成模块并尝试加载它们。因此,如果您没有在 lsmod 中看到您的声卡的驱动程序,则您的卡可能尚未配置。
如果声卡在 root 用户下工作,但在任何其他用户下不工作,您可能遇到了权限问题。如果是这种情况,以 root 用户身份,使用以下命令查看声卡的组所有者ls -l /dev/dsp; 它可能会是audio。然后,以 root 用户身份,将您的非 root 用户添加到/etc/group中的 audio 组。例如,我在我的系统中将用户 p 和 wellspring 添加到组 audio
audio:x:29:p,wellspring |
如果您使用 shadow 密码(在大多数最新发行版中应该是这种情况)以保持一致的组配置,请不要忘记使用 grpconv。然后注销并以非 root 用户身份重新登录。您的声卡应该可以工作了。感谢 James Barton 提醒我将此添加到 howto 中。
XFree86 4.x 提供了一种更集中和独立的视频处理方法。值得庆幸的是,许多功能,例如用于非 root 访问视频板的内核模块,已经消失了。
如果您的帧速率约为 1 fps,则您的系统未使用硬件 3D 加速。可能存在以下两种情况之一。
您的 3D 系统配置错误(可能性较大)
游戏 X 配置错误(可能性较小)
第一步是弄清楚哪种情况正在发生。
如果您有 X 4.0(X 3.* 用户请转到步骤 2),请查看以下输出X -probeonly。你会看到
(II) XXXXXX: direct rendering enabled |
或者
(II) XXXXXX: direct rendering disabled |
其中 XXXXXXX 取决于您拥有的显卡。如果直接渲染被禁用,那么您的 X 配置肯定存在问题。你的游戏没有问题。您需要弄清楚为什么禁用 DRI。此时您使用的最重要的工具是“DRI 用户指南”。这是一份写得非常好的文档,它为您提供了有关如何在您的机器上正确设置 DRI 的分步信息。副本保存在 http://www.xfree86.org/4.0/DRI.html。
请注意,如果您通过了此测试,则您的系统能够进行直接渲染。您的库仍然可能是错误的。所以继续执行步骤 2。
有一个名为 glxgears 的程序,它随 "mesademos" 包一起提供。您可以使用 Debian ( apt-get install mesademos) 获取 mesademos,或者您可以在 http://www.rpmfind.net 上搜索 rpm。您也可以从 mesa 主页下载并自行编译源代码。
运行 glxgears 会显示一些齿轮在转动。运行 glxgears 的 xterm 将显示 "X frames in Y seconds = X/Y FPS"。您可以将您的系统与下面的基准列表进行比较。
CPU TYPE VIDEO CARD X VERSION AVERAGE FPS |
自己编译 Mesa 和 DRI 模块可以将您的 FPS 提高 15 FPS;这是一个相当大的性能提升!因此,如果您的数字比同类机器慢大约 20 FPS,则 glxgears 很可能正在回退到软件渲染。换句话说,您的显卡没有对图形进行 3D 加速。
比 FPS 更重要的是大小窗口都有一个恒定的 FPS。如果硬件加速正在工作,则 glxgears 的 FPS 几乎与窗口大小无关。如果不是,那么您就没有获得硬件加速。
Linux 经常受到批评,因为我们没有其他平台拥有的丰富的游戏资源。坦率地说,对我来说游戏已经足够了,尽管拥有一些尖端游戏和经典游戏,如半条命和疯狂赛车,会非常好。幸运的是,我们拥有比你可以用棍子摇晃的更多的模拟器。虽然玩模拟游戏有时不如在原生机器上玩那么有趣,并且让一些模拟器很好地工作可能是一项艰巨的任务,但它们就在这里,而且有很多!
“真正的计算机”为操作系统提供了许多东西,包括 CPU、I/O 通道、内存、BIOS,以提供对主板和 I/O 资源的低级访问等。当操作系统想要写入硬盘驱动器时,它会通过直接与硬件设备内存连接的设备驱动程序进行通信。
但是,有可能为程序提供它需要的所有硬件资源。当它想要访问硬盘驱动器时,给它一些内存来写入。当它想要设置 IRQ 时,给它一些虚假的指令,让它认为它设置了一个 IRQ。如果您正确地执行此操作,那么原则上,可怜的应用程序无法知道它是在真正访问硬件还是被给予模拟硬件的资源所欺骗。虚拟机是欺骗应用程序使其相信它们在真正的计算机上运行的环境。它提供了真正的计算机将提供的所有服务。
虚拟机最初在 20 世纪 60 年代被用于模拟分时操作系统,但现在我们使用它们来运行为国外操作系统编写的软件,或者更常见的是,整个操作系统。由于虚拟机的性质,国外操作系统无法区分在虚拟机中运行还是在“真实”机器中运行。
所有 8 位 Apple ][ 模拟器都需要原始 ROM 的副本,无论您要模拟哪个系统,都在一个文件中。如果您努力搜索,您可以找到 Apple ][、][+、][e、][c 和 //gs 的 ROM 的文件副本。它们仍然受 Apple 的版权保护,如果您实际拥有其中一台计算机,您只能合法地使用它们。
KEGS 是 Kent Dickey 编写的 Apple II 模拟器<kentd(at)cup(dot)hp(dot)com>最初是为 HP-UX 编写的,但经过改进和定制以适应 Linux。它在任何颜色深度下都能在 X 环境下运行,并支持可变的内存大小、操纵杆和声音。KEGS 可以启动所有 Apple II 的变体,并支持所有 Apple ][ 的图形模式。我找不到这个应用程序的有效主页。
基于 SVGAlib 的apple2和基于 X 的xapple2可以模拟除了 //gs 之外的任何 Apple ][ 变体。界面有点古怪,但可用。配置也有点古怪;这款模拟器如果有一个基于 SVGA 或 X 的配置工具将会受益。它支持 6502 指令集中未公开的部分,一些游戏依赖于这些部分。apple2目前由 Michael Deutschmann 维护<michael(at)talamasca(dot)ocis(dot)net>并且似乎在以缓慢但恒定的速度开发。我认为这个应用程序没有主页。
dosemu <http://www.dosemu.org> 是 Linux 上规范的 DOS 模拟器。当您想到 DOS 时,不要想到 PROCOM PLUS 或其他名称简短且全部大写的 PROGRA~1 之类的东西。有一些真正的经典之作是为 DOS 编写的,例如 Carmageddon、Redneck Rampage 和 Tomb Raider。dosemu 可以运行这些。不幸的是,让 dosemu 工作需要付出很大的努力,而且截至 2002 年 1 月,声音代码有些损坏。当您尝试运行 Wordperfect 或旧的数据库应用程序时,这不是什么大问题。但对于游戏来说,绝对是一个致命的缺陷。让 dosemu 运行良好并不容易,但不幸的是,对于 DOS 游戏来说,这是最好的途径。祝你好运。如果您成功使用 dosemu,我很想听听您的反馈。
Wabi 是一个商业 Win16 模拟器。也就是说,它将从 Windows 3.1、Windows 3.11 或 Windows for Workgroups 3.11 环境运行 Windows 16 位应用程序。Wabi 最初由 SCO Unix 在很久以前创建,然后在 2001 年年中左右被 Caldera 收购。
Wabi 速度很快,并且对于它所做的事情来说做得很好,尽管我听说用于 Solaris 的 wabi 比 Linux 更稳定。它可能对玩旧的 Win16 游戏有用,但存在三个问题
您必须拥有 Windows 3.1/3.11 或 WfW 3.11 的授权副本。
Wabi 的价格对于它所做的事情来说非常昂贵。
Wabi 在 32bpp 或 24bpp 颜色下不起作用。
Wabi 本身不做 DOS,但它看起来可以使用 DOS 模拟器作为运行 DOS 程序的后端。有人谈论过 Wabi 3.0,它将进行 Win32 模拟,但据我所知,该项目被无限期搁置了。我认为 Wabi 将在所有架构的 Linux 下运行(有人可以验证这一点吗?)
Wine <http://www.winehq.com>,它带有 GNU 风格的缩写 "Wine Is Not An Emulator",是 Win32 API 的非商业实现。它不是模拟器的原因很微妙,大多数非计算机科学家对此并不感兴趣,所以我们在这里称它为模拟器(它实际上是 Win32 API 调用到 POSIX/X11 调用的运行时翻译)。Wine 已经走了很长一段路,并且能够模拟许多重要的程序,这对想要这类东西的 Linux 用户来说是个好消息。
Wine不提供 DOS API,所以你不能用它来运行 DOS 应用程序。为此,您应该查看 dosemu (第 10.3.1 节)。Wine 从来都不擅长实现 DirectX,尽管已知许多游戏可以在 wine 下运行。对于游戏,您可能需要查看 winex (第 10.5.3 节)。
除了将 Win32 API 运行时翻译为 POSIX/X11 (它在 Linux 上运行 Windows 应用程序) 之外,wine 还进行 Win32 API 到 POSIX/X11 的编译时翻译(它在 Linux 上编译 Windows 应用程序源代码)。从这个意义上说,wine 是一个 Windows 到 Linux 的移植工具。不需要 x86 架构,但建议使用,因为它允许实际的 x86 二进制执行以及直接的 DLL 使用。
您可以将 wine `与 Windows' 一起使用,这意味着 wine 使用的库实际上来自 Microsoft Windows 本身。只有当您拥有一个当前未在计算机上使用的 Windows 副本时,这才是合法的。据说 wine 在与 Windows 一起运行时效果最好。您也可以在没有 Windows 的情况下运行 wine。winehq 的人正在编写他们自己的库集,称为libwine它实现了 Win32 API,完全没有 Microsoft 代码。
Wine 最初是在 MIT/X11 许可下授权的,因此它可以用于商业和非商业目的。在 2002 年年中,wine 的一部分在 LGPL 许可下重新授权,因此它只能用于非商业目的。这给像 Transgaming (第 10.5.3 节) 这样的公司带来了问题,并促使 wine 分叉为 ReWind (第 10.5.2 节)。
Rewind <http://rewind.sourceforge.net/> 由 Eric Pouech (wine 开发人员) 和 Ove K�ven (winex 开发人员) 发起,以响应 wine 的许可证变更)。它最初是完全在 MIT/X11 许可下授权的 wine 的最后一个版本的快照。目标是保持 rewind 基于 MIT/X11,以便像 Transgaming 这样的公司可以提供基于 wine 的产品。
Winex 由一家名为 Transgaming 的公司发布 <http://www.transgaming.com>。开发人员采用 wine (参见 第 10.5.1 节) 并添加 DirectX / DirectDraw 支持。虽然 winex 是商业的,但他们有一个有趣的商业模式。
最终用户(您)可以免费下载源代码。但是,每月支付 5 美元,您可以成为 Transgaming 的订阅者。成为 Transgaming 的订阅者有三个主要好处
订阅者可以随时下载方便的 winex 打包版本,格式为 deb、rpm 或 tar.gz,包括更新。它们还比公开提供的 tarball 具有更多功能:后者是旧版本,缺少一些最新功能,例如对受版权保护的程序的支持。
每月都有投票,订阅用户可以对他们希望 winex 开发人员做什么进行投票。例如,他们可以投票支持诸如“改进对受版权保护的程序的支持”、“更好的 Installshield 支持”或“改进 DirectX 8.0 支持”之类的事情。据我所知,开发人员确实会听取订阅者的投票。
Transgaming 网站有一些用户支持论坛。一方面,他们使用我见过的最糟糕、最可怕、最令人困惑、最浪费、最愚蠢的格式,我希望上帝我再也不会看到格式像 Transgaming 那样糟糕的论坛。另一方面,您可以寻求帮助,开发人员非常擅长回答您的问题;他们的警惕性令人印象深刻。非订阅者可以浏览论坛,但只有订阅者才能发帖(因此可以寻求支持)。
winex 的开发人员将“经常”向 wine 发布他们的 Installshield、DirectX 和 DirectDraw 增强功能。作为回报,随着 wine 成熟度的提高,winex 开发人员将采用新版本的 wine 并将它们用于 winex。然而,自从 Transgaming 诞生以来,wine 的一部分已经在更严格的 GNU LGPL 许可下重新授权 (第 10.5.1 节)。这基本上意味着在重新授权日期之后发布的 wine 版本将不再被 winex 使用。因此,winex 现在将基于 rewind (第 10.5.2 节)。
Win4Lin <http://www.netraverse.com> 是 Netraverse 的商业产品。像 vmware (第 10.5.5 节) 一样,它使用虚拟机方法来运行 Windows 应用程序,因此您将获得一个大窗口,您可以从中启动 Windows 并运行各种 Windows 应用程序。与 vmware 不同,Win4Lin 只支持 Windows 95/98/ME,但事实证明这对于游戏玩家来说更好。由于 Win4Lin 专注于这些操作系统,因此报告称它在这些操作系统下运行游戏更快,并且比 vmware 做得更好。它也比 vmware 便宜得多。截至 2003 年 6 月,最新版本的 Win4Lin 是 5.0。但它仍然存在一些限制
它不支持 DirectX 或 DirectDraw,而 vmware 对 DirectX 有“有限”支持。
它只支持串行和并行设备。这对于使用 USB 操纵杆的人来说很重要。请注意,vmware 最多支持 2 个 USB 设备。
截至 2003 年 6 月,预计支付 89.99 美元而不含印刷文档,99.99 美元包含印刷文档。此外,没有可用的评估副本,尽管您获得了 30 天的退款保证。但是,由于它是商业的,您确实可以获得技术支持。vmware 贵得多。
像 vmware 一样,您需要拥有 Win95 或 Win98 的授权副本。Win4Lin 不能像 wine 那样使用现有的 Windows 安装。
它只能在 x86 架构上运行。
VMWare 是一个虚拟机,可以在标准的PC上同时运行多个操作系统:支持的操作系统包括微软的Windows系列,Linux,Novell Netware和FreeBSD。 你可以使用它来运行一个MS Windows操作系统并在那里启动你喜欢的游戏。你甚至可以在Linux下运行另一个Linux;如果你想测试另一个发行版,这将非常有用。太棒了! 现在来说说缺点。 你肯定需要一个不错的配置才能运行它;他们声称最低配置是500MHz的x86 CPU和128MB内存,但是如果你想获得合理的性能,更快的处理器和至少256MB内存似乎是最低要求。 并非所有Linux发行版都受支持:最新的RedHat,Mandrake和Suse受支持,但是如果你有其他版本和/或发行版(例如Debian),那么你可能就没那么幸运了。 此外,vmware对DirectX的支持有限,你可能无法玩最新的游戏。
有关更多信息,请参见 http://www.vmware.com。 它不是很便宜(工作站版本大约300美元),但是你可以获得30天的评估副本。
首先,你应该尝试一个模拟器。 尽管有些游戏可以通过wine运行,但是你可能会使用winex获得最大的成功:它对DirectX的支持不断提高。 从3.1版开始,对DirectX 8的支持几乎完成,但是对于较旧的DirectX版本(因此也是较旧的游戏)可能并非如此。
你还可以尝试像Win4Lin或VMWare这样的虚拟机,而不是模拟器。 如果你的目标是在Linux上运行Win95/98/ME应用程序,而没有USB支持并且在x86架构上,那么Win4Lin的成本和对Win95类型操作系统的关注使其成为比vmware更好的选择。 但是,如果你必须具有USB支持或在x86以外的平台上运行Linux,那么vmware是你的唯一选择。
现在,如果你的目标是在Linux下运行Win95类型的操作系统游戏,那么Win4Lin几乎看起来比vmware更好。 主要问题是vmware对DirectX的支持有限,而Win4Lin则没有。 仅此一项事实就使得Win4Lin和vmware都不适合大多数核心游戏目的。 但是,如果你打算尝试一下,那么使用vmware成功的可能性更大。
Lucasarts 为点击式冒险游戏编写了一个名为 SCUMM (Maniac Mansion 脚本创建实用程序) 的引擎。 他们使用 SCUMM 编写了许多图形冒险游戏,例如他们著名的猴岛系列(全部三部)。 Ludvig Strigeus<strigeus(at)users(dot)sourceforge(dot)net>能够对 SCUMM 格式进行逆向工程,并为基于 SCUMM 的游戏编写了一个解释器,该解释器可以在 Linux 和 Win32 下编译,名为 scummvm <http://scummvm.sourceforge.net/>。 他们的网站非常好,并且充满了关于 SCUMM 以及在 scummvm 下玩这些游戏的各种信息。
scummvm 网站上维护了一个兼容性页面。 顺便说一句,我已经能够完成许多被列为 90% 完成的游戏,没有任何问题。 scummvm 非常稳定,允许你购买基于 SCUMM 的 Lucas Arts 游戏,将数据文件复制到你的硬盘驱动器并在 Linux 下玩它们。 截至 2002 年 2 月,我一直在关注他们的 cvs,并且该项目正在不断开发中。 向 scummvm 团队致敬。
较早的 Sierra DOS 图形冒险游戏使用一种名为 AGI (冒险游戏界面) 的脚本语言。 用 AGI 编写的一些游戏示例包括 Leisure Suit Larry I (EGA)、Space Quest I 和 II、King's Quest II、Mixed-Up Mother Goose 等。 这些游戏可以使用 sarienon> <http://sarien.sourceforge.net> 玩,这是一个 AGI 游戏的开源解释器。
Sarien 是用 SDL 编写的,因此它应该可以在任何可以编译 SDL 程序的平台上运行。 此外,还有 DOS、基于 Strong-Arm 的 pda、QNS(天哪!嵌入式游戏!)、基于 MIPS 的系统和基于 SH3/4 的 Pocket PC 的版本。 开发人员显然疯了(以一种好的方式!)。 Sarien 还具有原始游戏中没有的许多增强功能,例如 Quake 风格的下拉控制台、图片和字典查看器、增强的音效以及对 AGDS(俄罗斯 AGI 克隆)的支持。 Sarien 正在开发中,如果有人想参与破解,开发人员在记录 Sarien 内部结构方面做得非常好。
较新的 Sierra 图形冒险游戏(我们在这里谈论的是 80 年代后期)使用一个名为 SCI 的解释器。 由于 Sierra 不断改进其引擎,因此 SCI 有许多版本。 最初的 SCI 游戏是基于 DOS 的,但 Sierra 最终开始发布基于 Win32 SCI 的游戏。 用 SCI 编写的一些游戏示例包括 Leisure Suit Larry 1 (VGA)、Leisure Suit Larry 2-7、Space Quest 3-6、King's Quest 4-6、Quest For Glory 1-4 等。 与 AGI 游戏相比,SCI 冒险游戏具有更好的音乐支持、更复杂的引擎和大量附加功能。
许多基于 SCI 的游戏(用 SCI0 编写的游戏)可以使用 freesci 玩,可在 http://freesci.linuxgames.com 获得。 像 Sarien 一样,FreeSCI 具有许多图形目标,包括 SDL、xlib 和 GGI,因此该程序可以在数量惊人的平台上编译和运行。 开发人员在记录和 FAQ 他们的应用程序方面做得非常出色。
Z-machine 是一个记录完善的 <http://www.gnelson.demon.co.uk/zspec/index.html> 虚拟机,由 Infocom 设计用于运行他们的互动小说游戏。 这允许他们以跨平台的方式编写游戏数据文件,因为只有引擎本身,即 Z-machine,才是平台相关的。 在 Infocom 的生命周期中,Z-machine 经历了多次修订,在 Infocom 消失后又经历了两次修订(Graham Nelson 创建的 V7 和 V8)。 后来的版本甚至支持有限的音效和图形!
最流行的 Z-machine 解释器之一是 Frotz <http://www.cs.csubak.edu/~dgriffi/proj/frotz/>。 这个做得非常出色的页面有很多互动小说爱好者的不错的链接。 Frotz 是 GPL 协议,运行所有版本的 Z-machine,并且可以在大多数版本的 Unix 上编译。 Frotz 已经衍生出许多分支,例如 PalmOS 和基于 Linux 的 PDA 的版本。
jzip <http://jzip.sourceforge.net/> 是另一个非常流行的 Z-machine 解释器,它将运行 V1-V5 和 V8 Z-machine 数据文件。 jzip 非常便携; 它可以在所有 Unix、OS/2、Atari ST 和 DOS 上编译。
实际上还有许多其他的 Z-machine 解释器,例如 nitfol 和 rezrov(用 Perl 编写!)。 每个解释器都有自己的一组优点,你可以在 Frotz 和 jzip 的主页上找到它们的链接。
Scott Adams 可以说是互动小说的鼻祖。 尽管他本人受到了第一部互动小说《冒险》的启发,但 Scott 将冒险带给了大众。 他的游戏适用于 Atari、Apple 2、Commodore、Sorcerer、TI 和 CPM。 他的公司 Adventure International 在 1978 年至 1984 年间发布了许多深受喜爱的游戏,然后倒闭了。 他最近发布了一个新游戏(没有 Linux 版本),但自从冒险游戏衰落以来,他几乎一直远离游戏行业。
Alan Cox 编写了 scottfree,一个用于 Unix 的 Scott Adams 冒险游戏文件解释器。 使用 scottfree 和任何可以从 Scott 的网站 <http://www.msadams.com/> 下载的 Scott Adams 数据文件,你可以享受这些经典作品。
Underworld Adventures 项目 <http://uwadv.sourceforge.net/> 致力于将 1992 年的经典游戏 Ultima Underworld: The Stygian Abyss 移植到 Linux、MacOS X 和 Windows 等现代操作系统。 它使用 OpenGL 进行 3D 图形,使用 SDL 进行平台特定任务,并根据 GNU GPL 发布。 Underworld Adventures 提供了一个令人印象深刻的图形系统,该系统使用原始游戏文件,因此你需要原始游戏光盘才能玩。
Underworld Adventures 还提供了一堆工具,供你显示关卡地图,检查 uw1 对话脚本的工具等等。
Ultima 7 实际上是 2 个游戏:第一部分(The Black Gate)和第二部分(Serpent Island),它们使用了 The Black Gate 引擎的略微增强版本。 此外,还向第一部分(The Forge Of Virtue)和第二部分(The Silver Seed)发布了一个附加磁盘。
一个团队开发了 Exult <http://exult.sourceforge.net/>,这是一个开源解释器,它将运行 Ultima 7 的两个部分及其附加磁盘。 Exult 是用 C++ 编写的,使用 SDL,因此它可以在任何可以编译 SDL 程序的平台上编译。 它还具有一些优于原始 Ultima VII 引擎版本的增强功能。 你需要购买 Ultima 7 的副本才能玩。 开发人员没有计划扩展 Exult 以解释其他的 Ultima,因为引擎在版本之间发生了如此大的变化。
Exult 团队还一直在努力创建一个地图编辑器 Exult Studio 和一个脚本编译器,这将允许用户以 Ultima 风格创建自己的 RPG。
System Shock 是一款经典的 1994 年第一人称射击/冒险游戏,这使其成为 Doom 的同时代游戏。 但是,它的引擎比原始 Doom 的引擎功能更丰富:例如,System Shock 具有 3D 精灵、自由视角以及在彼此顶部放置对象的功能,从而给人一种完整的 3D 地图的错觉,就像 Quake 一样。 游戏评论家一致认为,这款游戏具有 Quake 的功能,并且故事情节比 Half-life 更引人入胜。 System Shock 引擎针对复杂性进行了优化,而 Doom 引擎针对向你投掷大量怪物进行了优化; 完全不同的方法。 对于如此古老的游戏来说,真是令人印象深刻!
System Shock Hack 项目 <http://madeira.physiol.ucl.ac.uk/tsshp/sshock.html> 试图更新游戏以适应现代操作系统。 该项目使用 SDL 并根据修改后的 BSD 许可证发布。 虽然你需要原始游戏文件才能玩 SSHP,但它应该可以与 System Shock 演示一起使用,该演示是免费提供的。
无论你喜欢玩哪种游戏,这些都是 Linux 游戏玩家的一些资源。
关于游戏本身。
Linux 游戏新闻
面向德语人士的 Linux 元游戏网站。
所有已知电脑游戏的数据库。 它非常完整,是我最喜欢的网站之一。
ebgames <http://www.ebgames.com> 不再正式销售 Linux 软件。 他们在大约 Loki Software 宣布破产的同时停止销售 Linux 游戏和发行版,这很可惜,因为他们拥有我见过的 Linux 游戏最低价格。 但是,他们偶尔会出售诸如 Code Warrior 或 Redhat Linux 之类的东西。
你购买任何商业 Linux 游戏的一站式商店(像 Tribsoft 和 Loki 这样的软件供应商也在他们的网站上设有在线商店)。
这些公司曾经为 Linux 发布游戏,但由于某种原因不再积极参与 Linux 游戏。
作为将 CTP 和 Quake3 带到 Linux 平台的公司,Loki 是 Linux 游戏之父。他们是最早的公司之一,并且拥有数量最多的游戏作品(我拥有他们的全部游戏)。Loki 将游戏移植到 Linux 平台,主要使用 SDL 库。Loki 在 2002 年 1 月的倒闭是 Linux 在试图占领通用桌面市场方面遭受的最大挫折。Linuxgames.com 网站上有一个关于 Loki 的详细时间线,网址是:http://www.linuxgames.com/articles/lokitimeline
Tribsoft 发布了 Jagged Alliance 2,这是一个非常棒的 RPG/策略游戏,占据了我两个多星期的时间。他们原本计划发布 Europa Universalis、Majesty 和 Unfinished Business。然而,截至 2001 年 1 月 3 日,Tribsoft 的 Mathieu Pinard 表示他将休息一段时间,Tribsoft 暂时不会发布游戏。他仍然会支持 JA2,但不要期望会有补丁或更新。
MP Entertainment 发布了 Hopkins FBI,这是我最喜欢的 Linux 游戏。比 Quake 更暴力,比 Hustler 更多裸露,比 Liberace 更浮夸。它就像你显示器上的漫画书。他们原本计划发布 Hopkins FBI II 和其他一些游戏,但自从宣布以来已经过去了好几年,没有任何游戏即将推出的迹象。他们忽略了我所有试图获取更多信息的尝试,所以我不得不得出结论,MP Entertainment 的状态与 Tribsoft 相同。你仍然可以从他们的网站购买或下载 Hopkins FBI 的演示版。如果有人有关于这家公司或 Hopkins FBI 作者的更多信息,请与我联系。
他们提供了 Reel Deal Slots,做得非常出色!我不太喜欢纸牌/赌博游戏,但这款游戏令人印象深刻!由于他们的 Linux 程序员离开了公司,Reel Deal Slots 是他们的第一个,也是迄今为止最后一个 Linux 版本。
本节包含应该提及但没有在本指南中单独章节的 URL,因此我将它们作为附录列在此处。
Linux Publishing 不直接向公众销售,而是为出版商提供专业的游戏出版服务。我认为这意味着光盘复制、包装和销售给零售商。
XFree86 主页
对于那些想在 Linux 下编写游戏程序的人来说,这是一个权威的网站。它是一个信息交流中心,包含关于游戏编程各个方面的优秀文章(不一定专门针对 Linux),指向重要的游戏编程资源的链接,访谈,评论,投票和很多其他内容。很难想象有比这更好的关于这个主题的网站。
尽管 Linux Gamers' FAQ 令人惊讶地没有在其文本中将 Linux Gamers' HOWTO 作为资源提及,但我认为 FAQ 是本 HOWTO 的良好补充。我试图在本 HOWTO 中将特定于游戏的信息保持在最低限度。FAQ 采取了相反的方法;他们主要关注游戏本身,包括特定于游戏的问题以及从哪里获得 Linux 游戏。FAQ 和 HOWTO 在这方面是互补的,我试图不重述他们的内容。尽管作者有些脾气暴躁,但他们对 FAQ 的努力非常好。如果你想要一个关于特定游戏问题的通用信息来源,FAQ 是一个很好的起点。此外,FAQ 还维护着一个相当大的 Linux 游戏数据库。
本 HOWTO 主要针对想要用于在计算机上录制和制作音乐的专业或半专业声卡的音乐家。这些信息非常详细,对于游戏玩家来说可能有点过头了。