- 听众
- 收听
- 积分
- 1003
- 主题
- 回帖
- 0
- 精华
注册时间2007-2-6
最后登录1970-1-1
该用户从未签到
|
3D游戏之神——John Carmack
谈到游戏,从引爆了电脑游戏核弹的《DOOM》(毁灭战士),到让无数玩家沉溺在死亡竞赛中进行光荣与梦想战斗的《QUAKE》(雷神之锤),再到如今万人联机激情对抗的《半条命》和《反恐精英》,都有着强大的游戏引擎在背后支撑起这些伟大的游戏,而这些引擎的背后,都镌刻着同一个人的名字:John Carmack。
如今,Carmack的游戏引擎甚至已经成为衡量PC图形卡的公认标准,作为一个引擎编写者,他的一举一动能让硬件行业的大佬们胆战心惊。某些显卡生产商在研发新产品之前甚至会先同Carmack商量一下,以确保他们的硬件可以完美地支持ID(Carmack所在的公司)出品的游戏。
除了3D方面的成就外,John Carmack还为游戏业带来了许多其他技术革新:网络代码中的客户端侦侧、多重纹理和便于修改和可扩展的游戏代码,游戏内部的命令行指令……似乎所有该做的Carmack都已经做完了。Carmack的出世无疑是游戏迷的幸事,但又不能不说是其他同期游戏引擎设计师的不幸。
是什么让Carmack在短短几年内,便神奇般达到图像编程禅宗般的境界,让那么多富于创新的游戏设计师塑造世界的理想变成现实的呢?他是生来功力深厚?还是背后高人点拨?
事实上,在忍受了两个学期了无生趣的大学课程后,Carmack即告退学。以世俗的眼光,一个高中毕业的毛头小伙能有何大作为?然而,就在2001年,刚而立之年的Carmack即步入美国互动科学艺术协会名人堂,成为第四位获此终生荣誉的游戏界名人,也是迄今为止最年轻的一位。他是人?亦或是神?
研读完Carmack的过去,你会无比尊敬地发现,其无与伦比的专注精神举世无双。他所有的一切完完全全根植于自学和钻研,十年如一日地努力营造出真三维的电脑空间。尽管他现在身价连城,拥有20多辆法拉利,但Carmack仍醉心于自己的工作,生活方式一如十年前的自己,像代码风格那样:简单、整洁、高效。
为了静心研究,他会如僧侣般与世隔绝,不出旅馆门一步。正如Carmack坦言:“我的人生就是以知识的积累和学习的不断深入来分为不同阶段。如果科班出身的图像程序员知道我在写DOOM时有多业余,他们肯定会大吃一惊,那时我甚至不能正确地剪切墙体多边形。我也为游戏的完成而自豪,但这途中所克服的各种困难却更加让我铭记。” 展望未来,Carmack相信《毁灭战士III》的图形技术将在未来5年内引领游戏引擎的潮流。
“教给你的同行一些东西,不会因此而失去什么。一辆法拉利小车只是物质享受,做人最重要的是真诚。” Carmack不仅痛恨一切软件专利制度,而且还身体力行地去铸就自由文化的辉煌。其免费发布源代码使他获得玩家和社会的广泛尊敬。早在1993年DOOM游戏中,Carmack就公布了关卡编辑器和其他辅助工具的源代码。Carmack对游戏开发进度和想法永远是公开的,每天的工作思路和开发进度都写在一个后缀名为*.plan的文件里,任何人通过网络都可浏览。
Carmack已经不只满足于游戏业。他说:“游戏设计中的很多问题对我来说并不是什么真正的挑战,因为我经历的已经太多了。”已经“快达到图像编程顶点”的Carmack,如今又重新拾起了儿时对火箭的爱好,他们的目标是一千万美元的“X大奖”——把三名乘客送到外太空。对于专注的Carmack而言,这又有什么不可能呢?
“在信息时代,客观障碍已不复存在,” 厌恶那种貌似先哲圣贤般地夸夸其谈的Carmack说:“所谓障碍都是主观上的。如果你想研发什么新的技术,你不需要几百万美元的资金,你只需要在冰箱里放满比萨和可乐,再有一台便宜的计算机,和与之献身的决心,你即可拥有任何你想拥有的编程深度!”
John Carmack乃真神也
在QuakeIII的源代码里,有1个求Inverse Square Root( 就是1/sqrt(x) )的函数,
Carmack实现的算法在有的CPU上,比正常的(float)(1.0/sqrt(x))快了4倍!(上面这个表达式里的sqrt(x)还是直接调汇编指令fsqrt来算的!!!)
Carmack的代码如下:
float Q_rsqrt( float number )
{
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // evil floating point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the ****?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
#ifndef Q3_VM
#ifdef __linux__
assert( !isnan(y) ); // bk010122 - FPE?
#endif
#endif
return y;
}
实际上就是Newton法迭代,但Carmack使用了一个神秘的常数,0x5f3759df,只迭代一次就求出了结果.
Purdue大学的Chris Lomont写了一篇论文http://www.lomont.org/Math/Papers/2003/InvSqrt.pdf,他在里面用数学方法推导出了一个常数0x5f37642f,跟Carmack的稍有不同,效果也没有Carmack的好.
天才就是天才啊,Carmack不过才是high school毕业吧. |
|