[译者的话:John Carmack是谁,不必我介绍了吧?虽然从文化、社会的角度讲,Quake还处在一种边缘和颇具争议的位置,但从CG技术角度讲,Quake绝对是个里程碑。大约就是从Quake,从id,从John Carmack开始,CG抹下了神秘的面纱,走下学术的神殿,走进芸芸众生的日常生活中。从此谈论z-buffer、反走样、纹理映射、消隐技术的,不再限于象牙塔中的专家学者了。是Quake使CG走向大众,走向实用。作为一个CG的专业研究者,这样的现象是我所乐见的。
作为一个专业研究者,令我汗颜的是:在这篇已经算是“旧闻”的文章里,充斥着许多闻所未闻或不知其详的新名词、新术语。但这篇文章的两位主角,一是普普通通的游戏爱好者,二是自学成材的技术天才,二者都不是名满天下的前辈耄宿,却都能就这一领域的前沿动态侃侃而谈。作为身处象牙塔内的学子,我不由反省,千万不能有井蛙之见哪!]
作者:Rob Jellinghaus
-------------------------
星期一早上(11月16日),我收到了John Carmack对这篇文章的两处勘误,一是关于Java授权(是Kaffe而不是Cafe),二是C语言游戏DLL代码的长度(是30K而不是3K)。这两处错误我都已经进行了修改。星期一下午,我又增加了两个部分,分别是John的“光栅矢量”模拟,我加入到了“3D的未来”这一部分,以及对多分辨率的书的介绍。
-------------------------
昨天我在我旧金山的公寓里上voodooextreme.com网(也可能是bluesnews.com),突然我看到一条消息,说John Carmack将在15分钟后在职业玩家联盟锦标赛上发表讲话,讲话地离我住的地方相隔大约十二个街区。机不可失,山地车伺候!十分钟后,我已经在观看星际的决赛了,恰好赶在这个大人物出场讲话之前。
在网上其他地方不难找到关于这场决赛和John的这次讲话的内容介绍,但我排除万难争取到一个机会,在John发表完他的官方讲话之后和他谈了一会,并且问了他几个只有像我这样求知欲旺盛的技术迷才会感兴趣的问题。(顺便说一句,如果你看了网上的John的讲话录象,第一个提问的观众--那个问“你是不是仍然认为基本上所有的解析曲面表示法都是垃圾?”的家伙--就是我:-)
现在您看到的就是我们之间谈话的记录。所有这些记录都是我根据回忆整理的,包括一部分额外的说明性文字--我当时既没有录音机也没带笔记本。如果有所偏差,全部责任在我--如果你发现什么东西让你想骂John的话,请先来骂我,因为可能是我搞错了。
内容提要:
1.Java与Quake的联姻--为什么还没有实现
2.3D图形技术的未来
3.Quake架构逸闻
4.关于John的讲话的一些要点
5.我的个人感受
6.致谢
Java与Quake的联姻--为什么还没有实现
据说John曾经与一个Kaffe小组进行过谈判,后者希望能随Quake 3发行一个他们的Java虚拟机(John甚至说这个小组“很有说服力”)。但最终John还是强烈反对这一计划,他主要是基于下面几个理由:
*移植性:虽然Java对可移植性吹嘘得挺厉害,但事实上还没有一个Java虚拟机能稳定的通用于所有可以运行Quake 3的“关键性”平台(包括Mac、Windows和Linux)...每种平台都有各自最好的Java虚拟机,但这些虚拟机在跨平台的兼容性方面都不容乐观(例如在与本地代码的集成方面)。John说(这些虚拟机)虽然在向其他平台,如Irix或BeOS上移植方面确实做得不错,但尚不能博得市场的青睐。
*效能:作为一种内置垃圾收集机制的语言,Java在运行时的效率不象C那样可以预测。(我现在在为一个使用Java的“互连网广播”视频动画系统工作,因此我得以发现这个问题还是有方法可以解决的。不过这些方法确实尚存在一些问题)。
*稳定性:Java正在全面实现其所有特性的道路上举步维艰(看Sun花了多久才推出Java 1.2就知道了)。而Quake 3也还存在大量悬而未决的顶尖技术难题。John不希望再添进另一个不成熟的东西来搅和了。
*调试难度:Java的调试器仍然落后于人们的期望值。(不过我在VJ++ 6.0的使用中得到了很大的乐趣......没错,它是微软这个恶魔的产品,但这个开发环境实在是“太”棒了!)[译注:me too:)安迪尔森确实是天才,为什么微软不调他去vc项目?]
o我想尽办法也没有问出John具体是怎么在运行时解释器里调试他的C语言库的--显然你可以把代码在本地编译,然后用任何一种标准C的调试器来调试,但调试C语言编译器(以及它的“字节码”解释器)就是另外一回事了,至于在这个环境下调试C代码则具有双重的难度。我猜解决方法不外乎“首先确保编译器和解释器是可靠的”:-)
[译注:这里指的是Quake自带的被称为Quake C的一个扩展工具,用户可以用标准C代码来扩展Quake的功能。我只见过一代的QC,唔...感觉可以用一个成语概括:“神乎奇迹”]
*John还提到了一个(的确)次要的问题:为了支持Java,他不得不重写并重新调试超过30,000行的游戏成品DLL库代码。不过从长远看来,John还是认为Java要比C优越,而且他也在以极大的兴趣关注Java在实时3D游戏方面的进展。
3D图形技术的未来
早在四月份,John在一份plan里声称,“基本上所有的解析曲面表示法都是垃圾。”直到现在,我还是念念不忘这个论断。于是我问他关于这个论断的问题。这里是他的一些观点(以及我用我为数不多的一点3D图形方面的知识进行的解释):
*(平面)多边形和曲面都是解析表达法,二者都面临共同的“尺度敏感”问题[译注:这是我杜撰的名词,原文是Scalability,意指随着被表示物体复杂程度的增加,数据量急剧膨胀的问题。]。如果用多边形构筑你的世界,“屏幕上可见多边形数量”的噩梦将如影随形。采用曲面建模可能会在一开始有所帮助,但很快你又会陷入“屏幕上可见曲线(曲面)数量”的泥淖之中,迫使你不得不求助于四次曲面[译注:CG中常用的曲线曲面多是三次的,故有此说]。
*John实际上寄希望于未来3D硬件将使用“多分辨率”表示法,采用这种方法后,整个世界将以某种特定的数据结构表达,这种数据结构能够从根本上保证从任意视点处渲染场景的时间都接近常数。
*Voxel可能就是这类数据结构的一个例子。John提到他实际上是写了一个voxel渲染机,并为之重建了整个Quake 2的关卡,数据量多达3G之巨!但John说,如果你能用智能化的数据流技术调度voxel集合的不同部分出入显存,那么即使如此大的数据量也不会超出现有的硬件处理能力太多。[译注:这一段不太理解,这么先进的技术,以后要多花点时间研究研究才行]John还说,对整个世界采用“唯一”的数据结构进行记录是比较理想的--不要有那么多的点、面、BSP树[译注:表示空间形体的一种数据结构]...只要用一个oc树节点(以及它的同型子节点)就可以表示一切。
*包括频率空间表现技术(比如小波压缩方案)在内的另外一些新技术也有可能使用。(可以把小波压缩想象成类似分型压缩的一种先进的渲染技术,它是应用于整个3D空间的。但John完全没有提到分型压缩;他只是谈到了“频率空间”这个词,然后在我说出“小波”的时候频频颔首:-)John提到有一本关于多分辨率图形技术的书,其中包括了一些频率空间3D建模和渲染技术的介绍,但他没有说具体是哪一本书;我猜可能是Tony DeRose的Wavelets for Computer Graphics。[译注:匪夷所思,这一段里牵涉的技术太深奥了。分型压缩是知道的,小波分析就只闻其名了。至于“频率空间”-- frequency space representation --则是闻所未闻,也不知道翻译得对不对,还望方家指正]
*John喜欢做的一个类比是从矢量图形(这种技术把整个的2D屏幕用一条条连接两点的直线来进行描述)到光栅图形的转变过程。使用矢量图形技术,一开始的数据量很小,但是随着2D图象变得越来越复杂,这种技术就吃不消了。与之类似,今天的解析多边形/解析曲面技术在描述简单模型的时候数据量同样不大,但一旦模型变得复杂起来,你就会感到处处掣肘,这时你就希望有另外的方法来描述3D空间了。
*多分辨率技术在当前面临的主要问题是它不支持在分层表示的世界中使用纹理映射...要使它象今天的多边形渲染系统一样支持不同的纹理细节,恐怕还为时尚早。
*所有上述这些新技术都将在几年以内成为主流。
*我问John象这样的多分辨率建模是如何进行的问题,他回答说,他估计这个过程将会返朴归真--画家和模型制造人员直接雕刻或绘制出实际的模型,就象今天在电影界常做的一样,然后以毫发毕现的高精度把这些模型扫描到多分辨率的表示系统中去。之所以要这样做,是因为在目前建模还是非常艰苦和困难的,因为建模者总是在既抽象又粗糙的数学表示法面前殚精竭虑--与制造一个实际的模型相比,把模型分解成一个个多边形和曲面是非常困难的!一旦我们不再把那些抽象的数学结构当作构建世界的基础,建模就将回复它的本来涵义。(注意:这一部分里我可能听错的地方极多,不要为此而感到吃惊!)
Quake架构逸闻
这里是关于Quake 3的内部架构的一些奇闻逸事,大家姑妄听之吧。
*不久前曾听到John提到他在曲面的碰撞检测方面遇到了一些麻烦。这次我趁机问他现在解决得怎么样了。他说他使用的还是Quake 2中用的基于多边形的物理性质的代码;为了把它们运用到处理曲面上,John仅仅是动态的把曲面的相关部分进行网格化,细分的程度以“游戏内部的物理性质”需要为准,然后把处理后得到的这部分多边形用处理多边形的物理性质的代码处理过。这种方法还是有可能得到精确解的--“只要用几次Newton-Raphson迭代就行了”--不过没有必要。原先处理多边形的代码已经成了独一无二的“bug温床”,所幸bug已经被一一杀灭;再进行“精确的”曲面物理性质求解更无异于重新打开潘多拉的魔盒。一般说来,近似在3D程序设计中的重要性被低估了。John感到大多数人都会认为“只要你能做到多精确,你就应该做到多精确”,而在他的经验中,近似的解法经常要比精益求精来得好。
*在Quake 3中,不同的模型[译注:指运动物体,下同]的动画速率是相互独立的;一个“蠕动”物体的动画刷新频率可能只有5赫兹,而一个“跑”着的物体的动画频率则可能有15赫兹。
*游戏中有一条单一的图形处理管道来统一处理所有东西--既包括物体,也包括背景。程序仍然使用BSP树,但BSP树“仅”用来计算景物的可见性;一旦场景中所有的可见部分都计算出来之后,这些东西都被送入同一条管道进行绘制。这意味着所有可施加于场景的特性都可以被施加于模型,而反之亦然。John对这个设计非常喜欢。
*客户端作弊的问题,归根到底是无法解决的;客户端运行的所有程序都可以被逆向工程和解密,而任何的网络协议也不能阻止人们以之谋私。但id正打算投入一部分精力来使之不易作弊,John个人也不惧与那些以作弊为目的疯狂进行逆向工程的人对簿公堂(id Software的许可证书是禁止逆向工程的,而我们也很容易证明那些作弊器的作者肯定为了作弊的目的而对代码进行了逆向工程)。John义正词严的说:“(作弊者)会毁了这个属于千千万万玩家的游戏,而且他们也正在触犯法律。”所以哦,那些客户端的黑客,你们要小心了,id有法律为他们撑腰...
而且我个人注意到,John最近的plan总能做到“与时俱进”[译注:)],这个plan对我手头的项目帮助很大...感谢John!:-)
我(还有其他人)与他交谈的时间真是有点长了,因此...
关于John的讲话的一些要点
唔...看来这次演讲上网的时间没有我想象的那么快。好吧,这里是我记得的一些要点。
*John以一个甚为冗长的、关于id在Quake 3上所做的各种权衡的介绍开篇。基本上,John坚信在多人游戏方面投入更多时间要胜过在单人关卡上投入精力,因为一个好的多人游戏将吸引玩家数年,而最精彩的单人游戏也只能让人玩上一次然后扔掉。他谈到了努力成果的问题,“对一个关卡设计师来说,自己花上数月辛辛苦苦设计了一组关卡,结果玩家只玩了一个晚上就通关了,然后就弃置一旁,这种感觉无论如何也不会好吧?在网上,玩家们仍然在玩Quake 1,但你没见过有谁在玩,比如说,Quake 1单人游戏的第三关吧?”
*因为Quake 3没有故事情节,所以也就没有在游戏节奏比较慢的部分故意“钓”你胃口的东西。没有那种“我之所以要坚持玩比较无聊的这一关,是因为我希望看到后面剧情”的无奈感觉,而有些游戏恰恰就是靠这种手法来吸引玩家玩的时间长一点。Quake 3这个游戏从头至尾都充满着触手可及而且源源不断的吸引力。
*他们在细微之处付出了很大努力。他们解决了Quake 2中的“击退”问题(Quake 2中,无论对方用哪种枪,中枪时你都是牢牢站在地面上的),因为John认为加入“击退”效果是对的:在被击中时,你通常都会在大约200毫秒的时间里象飞起来一样。这样会使射击周围的人的时候容易一点,同时被击中的人仍然能够控制自己的动作。(这一部分我大概又听错了,不过要点就是这些)总之,为了加入这种效果,在视角变换、武器运动、跳跃动作等方面都有细微的差别需要改动,这个工作量还是很大的。
*(id或者John)的目的是使Quake 3不但比Quake 1感觉上更加暴力,而且也要比Quake 2来得血腥。最终的目标是使这个游戏不但成为以往游戏的集大成者,而且要青出于蓝而胜于蓝--要使这个游戏好到使玩家完全忘却Quake的早先版本。
*id将设计几个不允许玩家采用任意视角的关卡。之所以有此想法,是因为二维的自由视角对那些FPS新手而言学习起来难度太大。Doom上手要快得多,因为在Doom里你不会意外的看到地板或者天花板。id将设计几个“新手上路”关卡,在这些关卡里玩家不需要抬头或低头。在这几个关卡里轻车熟路以后,你就可以进入需要用鼠标控制全方位视角的真正全3D关卡战斗了。
*id不会起用自己的网站(象battle.net)或者组织自己的锦标赛(象PGL)。id是个小公司,而且希望保持这个小格局,他们的重心还是放在开发上。John所能做的就是在代码中协助支持建立游戏服务器或者竞赛,他会悉心听取各方的意见,也会一如既往的努力工作。
*John被问到关于多CPU支持的问题。他说当客户端采用多线程技术以后,会发展出一些有趣的可能性,比如多显示器等等。但是通常客户端的同步是很困难的(常看他的plan的人应该知道)。至于多线程的服务器,他基本上认为目前还不大可能有哪种mod需要许多人--比如说超过40个人--同时参与。只要有人示范了一种真的需要支持这么多人同时游戏的游戏风格,他就会立即投入到扩充服务器容量的工作中去。他说,这个问题“我觉得是一项很有意思的技术挑战,但这不是对我目前时间最好的利用方式”。听了他的话,我个人的想法是,对于那些.mod的设计者们,这是一个重要的挑战。如果你真的设计出了一个规模宏大的群体游戏关卡和游戏模式的话,John可就要来找你啦:-)
我的个人感受
*Java将继续占领世界。(open source也会大行其道--不过这已经跑题了:-)
*我希望知道多分辨率技术将何去何从--这绝对是个活跃的研究领域。
*John用id的老游戏的寿命来证明多人游戏具有更长久的生命力,这一点倒很有趣。不过他话锋一转,又指出老游戏的寿命之所以长,部分原因是因为后来的游戏(Quake 2)不够理想,他最后又说希望这一次能让玩家彻底放弃老游戏,因为Quake 3将是多么的出色。换句话说,只有id自己才是id游戏寿命的最大威胁!
*单人游戏提供给玩家的是一个或大或小的故事。讲故事是人类创造力的一个巨大的组成部分,而单人游戏(包括某一天,真正出色的合作游戏出现)仍会兴旺发达,因为它们创造了讲故事的空间。事实上,id的许多创新,一方面制造了“暴力感”和沉浸感,另一方面也会刺激单人游戏的水平提高。
致谢
我希望你能喜欢这篇访谈录!深入到John的思维深处是对我来说是一份不期而至的周末礼物,上帝知道我已经等不及看到Quake 3了!id的伙计们,好好干--在21世纪见证(并且玩)id的劳动成果是多么快乐的事啊!
Rob Jellinghaus