IT人物(ID:itrenwu) 猿妹编译
综合自:http://cppdepend.com/blog/?p=744、
他是一个程序员,他是3D 游戏之父,第一视角射击游戏之父,他创办了大名鼎鼎的id Software公司,他创造了《德军总部 3D》,《毁灭战士》《雷神之锤》,他只上过半年大学,却是游戏开发者们的偶像,今年,他已经48岁了,他叫:约翰·卡马克。
卡马克的奋斗经历
约翰·卡马克小名约迪。他的家境很好,小学时,,这是当地最好的学校之一。这个从一岁起就戴上眼镜,长着一头凌乱金发的瘦小男孩在学校里很快就显示出了与众不同。二年级的时候,只有七岁的他几乎在所有标准化测验里都得到了满分,这相当于九年级的水平。
尚在就读高中时,卡马克就被认为是“怪才”,他还因此被学校视为有心理问题,并停课一年。复课后,卡马克还是拿到了毕业证书,并考入了当地著名的Kansas大学。在编程方面,卡马克几乎是无师自通。大一还没读完,他编写的一些小游戏就被不少软件公司买走,他本人也成为了几家软件公司的兼职程序员,并逐渐在游戏软件领域小有名气。
1990年,正值计算机技术的黄金发展时期,IBM个人电脑为整个软件业带来了前所未有的机遇。但这时的软件多以商业用途为目的,游戏软件却少人问津。当时一家名为Softdisk的软件公司找到了在读大二的卡马克,希望他加入公司,一起开发游戏软件。出于对游戏软件的热爱,他毫不犹豫的同意了对方的邀请,从此走进游戏的世界。
开创3D游戏传奇
他开发的游戏包括“Wolfenstein3D”(德军总部3D)、“Doom”(毁灭战士)、“Quake”(雷神之锤)系列等。
2013年时,声称“兴趣已不在开发上”的卡马克离开了id Software游戏公司,随后摇身一变为傲库路思公司首席技术官。但是卡马克并未远离游戏业,他的热情在虚拟现实技术上。
卡马克针对自己的游戏《Doom 3》开发了一个VR版本,并在2012年E3游戏展会上现场演示了这个版本,结果现场一片好评,Oculus Rift 一下子火了起来。
在Oculus未被Facebook收购的时候,他独自负责Gear VR的项目。而三星并未开放给卡马克必要的三星手机设备(前置缓冲区)的访问权限。结果大发黑客的本质,黑了三星的手机,并展示了改进后的效果,成功说服三星并给了他足够大的权限。
对于卡马克来说,玩火箭只不过是改装汽车一样的业余爱好,虚拟现实才是他真正的“星辰大海”
从《危险的戴夫》到《德军总部 3D》,从《毁灭战士》到《雷神之锤》……从 Oculus Rift 到 Gear VR,再从《毁灭战士3:BFG》到虚拟现实版《我的世界》……他一步一步不断在接近自己心目中的那个圣杯。
坦白地说,卡马克主要是一名技术天才,id公司出品的每一款游戏都是围绕他所编写的引擎制作而成的,卡马克不断把引擎技术推向新的高度。
大神代码的过人之处
到底他编写的引擎到底有多厉害,下面可以通过以下源代码找到答案:
作为C ++程序员,John Carmack的源代码时也有同样的感觉。他的代码简单却很强大,下面,我们一起来看看Doom3的一些源代码,并尝试理解代码,虽然它很简单,但非常高效。
2011年11月23日,id Software(游戏公司)延续了自身传统,并发布了他们之前引擎的 源代码。这个源代码已经被许多开发者审查过了,下面是来自其中一个Doom3的一个反馈信息:
Doom 3 BFG是用C ++编写的,这种语言非常广泛,它可以写出非常优秀的代码,幸运的是,id Software的C ++子集是拥有类的C语言,可以轻松运用C++:
● 无异常。
● 没有引用(使用指针)
● 尽量不使用模板
● 常量无处不在
● 拥有类
● 多态性
● 继承
它仅仅使用 c ++ 98 标准的一个子集。以下是Doom3的一些设计特性:
1、许多类都是从idClass继承:
idClass提供以下服务:
● 实例创建。
● 类型信息管理。
● 事件管理。
2、字符串操作变得十分简单
字符串是项目中最常用的数据类型,许多处理都是使用它们来完成的,我们需要使用函数来处理它们。
Doom3定义了一个idstr类,它包含几乎所有操作字符串的操作方法,不需要像其他框架一样需要提供的许多字符串类来定义自己的方法。
3、源代码与GUI框架(MFC)高度解耦
在许多使用MFC的项目中,代码与它们的类型高度耦合,并且你可以在代码中的任何地方找到MFC中的类型。
在Doom3中,代码与MFC高度解耦,只有GUI类与它直接相关。如下面的CQLinq查询所示:
这个特性对开发效率有很大的影响。的确,只有Gui开发人员必须关心MFC框架,而对于其他开发人员来说,不需要花费时间在MFC上。
4、它提供了一个非常好的实用程序库(idlib)
在几乎所有项目中,最常用的类型都是utility类,如以下查询的结果所示:
从上图我们不难发现,最常用的类型确实是utility类。如果C ++开发人员没有一个强大的utility程序框架,他们将会耗费大量开发时间在与技术层次上。
idlib提供了所有需要的方法/类来处理字符串,容器和内存。这有利于开发人员的工作效率,并让他们更专注于游戏逻辑。
5、实现非常容易理解
Doom3实现了一个硬编码的编译器,如所有C ++开发人员所知,开发解析器和编译器并不是一件容易的事。但是,Doom3的实现非常容易理解,代码非常干净。
以下是编译器使用的类的依赖关系图:
来自编译器源代码的代码片段:
我们已经研究了许多解析器和编译器的源代码。但是,这是我们第一次发现一个编译器的源代码这么容易被理解,对于整个Doom3源代码来说也是一样的。这简直太神奇了。当我们探索Doom3源代码时,不得不说这些代码写的实在是太完美了
Doom3源代码只使用了C++标准的一个子集,非常简洁,易于理解和维护,没有使用高级技术,它的代码设计,命名和格式化代码的都是遵循基本规范,但却是最佳的实践。
约翰卡马克的秘诀就是遵循KISS原则:
KISS 是英文 Keep it Simple and Stupid 首字母的缩写,意思是"保持简单和愚蠢",其中"愚蠢"不是"傻",它还有"迟钝"、"不敏感"、"乏味"、"无价值"等含义;另一种对KISS的解释是 Keep It Simple, Stupid,由于中间加了逗号,意思就变成了"保持简单,傻瓜",是一种祈使语态,带有调侃的色彩。 从英文的直译是把事情弄得越简单、越傻瓜化越好。
KISS原则指出,对于大多数系统而言,越简单的系统运行效果越好。
采用新的C ++标准时需要学习什么?
新标准引入了许多新的有趣功能。但不要认为这些功都能使你的代码非常高效。许多新功能对开发通用库更为有用,特别是与通用编程相关的所有功能。
不要强迫自己使用所有新功能,只有在绝对需要时才使用功能,这样有助于提高代码的效率。
人到中年,仍不忘学习
前不久,他在几乎没有接触过神经网络的情况下,仅用了一周时间,在几乎是最基础且受限的编程环境下,从零开始徒手撸码,实现了反向传播和CNN。
约翰·卡马克先是在他的Facebook上发表了一篇名为1-week experience learning neural networks from scratch的学习心得,引起了网友的广泛关注,目前在国外程序员论坛 Reddit 的 MachineLearning 板块下,卡马克一周编程实践的话题受关注度 364,共收获 53 则留言
如今已经48岁的卡马克还在学习新技术,编写代码,所以忘记中年危机吧,正如卡马克说过:
在信息时代,客观障碍已不复存在,所谓障碍都是主观上的。如果你想动手开发什么全新的技术,你不需要几百万美元的资金,你只需要在冰箱里放满比萨和可乐,再有一台便宜的计算机,和为之献身的决心。我们在地板上睡过,我们从河水中趟过。
●编号249,输入编号249直达本文
●输入m获取文章目录
