月石一 发自 凹非寺
量子位 报道 | 公众号 QbitAI
还记得它们吗?
对00后们来说,也许有些陌生,但是80后、90后的游戏玩家们,应该再熟悉不过了~
《毁灭战士RPG》、《兽人与侏儒》1和2、《德军总部RPG》等等……满满的回忆啊~
这些游戏的开发者,最近发了几条推特,其中提到,自己曾经开发了这几款游戏的“功能手机”版本。
风轻云淡说出这话的大神,就是被称为“3D游戏、FPS游戏之父”的约翰·卡马克(John Carmack),他也是游戏公司id Software的创始人之一(FPS:第一人称射击)。
这段话直接在网上引发了一波回忆杀。
考古经典游戏
事情的起因是这样的,卡马克的儿子想要玩《兽人与侏儒2》,而高通公司的BREW平台上已经没有模拟器和档案了。
△2015年,约翰·卡马克之子(图源:大神的Twitter)
好在,J2ME(java移动)版本仍在流传,可以进行仿真,于是大神父子俩开启了一场“复古冒险”。
虽然,游戏可以在KEmulator(在电脑上运行的java模拟器)上运行,但是音频存在问题,而且在游戏中死亡后就会挂起。
好吧,我们是程序员,应该能修复它。
于是父子俩转向了开源软件freej2me,这次没有发生挂起的问题,但是音频却更糟了,需要用补丁修复。
此外,卡马克发现,尽管游戏是为100MHz以内的移动CPU设计的,可模拟器却占用了大量CPU。
经过探索,最后他们通过Flight Recorder(记录引擎)和JDK Mission Control(实时监控),发现根本原因在于:明确地调用垃圾收集(GC)。
因为在一些手机上,每一帧都必须调用system.GC(),以避免出现问题。
在128k的手机上和在多GB堆内存的台式机上,进行GC扫描是非常不同的,在现代计算机上,一个操作的速度要慢10倍以上。
怎么办?
虽然无法改变游戏的源代码,但是JVM有个很好用的参数:-XX:+DisableExplicitGC,可以禁止代码中显示调用GC。
此外,卡马克还分享了自己早年间的文章,感兴趣的朋友可戳文末链接~
用C++写CNN的卡马克
大神约翰·卡马克,何许人也?
出生于1970年的他,可是一位名校辍学、自学成才的典型。
他曾经对3D图形技术作出了巨大贡献,称他是游戏行业最具影响力的人也不为过。
△约翰·卡马克(图源:Wikipedia)
卡马克与游戏的渊源,当然不止Twitter中提到的这些。
1991年,由他和朋友共同创办的id Software游戏公司,开发了风靡全球的《德军总部3D》,在很大程度上普及了FPS游戏。
△id Software的Logo(图源:Wikipedia)
这款游戏还使用了他独创的3D引擎,而不久之后问世的《毁灭战士》,再次席卷全球。
此外,他还用3D加速技术,为《雷神之锤》制作了特别版本,使游戏画面渲染速度更快、分辨率更高。
1999年,卡马克的公司推出了《雷神之锤III》,这是一款多人连线FPS游戏,由id Tech3引擎制作,这款强大的引擎,直到6年后仍被许多游戏采用。
并且,它还是首个要求显卡具备硬件加速能力的游戏。
△雷神之锤III(图源:Wikipedia)
2008年,《德军总部RPG》推出,它是一款RPG(角色扮演游戏),同时也是射击类的探险游戏。
不仅是电脑端,在2005年和2009年,id Software又分别推出了《毁灭战士》1和2的RPG移动版。
除了游戏开发之外,卡马克还是开源运动的积极拥护者。
他在90年代陆续放出了《德军总部3D》、《毁灭战士》、《雷神之锤》等游戏的源代码,不少游戏都是在它们的基础上被制作出来的。
这位大神级别的程序员,你以为他只“玩”游戏吗?对于新兴的人工智能,他也没落下。
只不过是以一种“电脑怪才”的方式,他用一周时间玩了一把「复古与现代的碰撞」——用C++写了个CNN代码。
除此之外,卡马克还是个火箭爱好者。埃隆·马斯克还曾有意邀他合作,多年来两人时常在社交媒体上互动。
网友集体怀旧
这场卡马克父子俩的“复古大冒险”,引得网友直呼:really cool!
很好的故事! 和你的儿子一起回到过去,摆弄这种东西,一定非常酷 :)
我在手机上装了J2ME Loader,玩当年在索尼爱立信W595上的游戏,感觉非常爽 :)
蠕虫病毒、僵尸感染、模拟人生、魔鱼等等…… 真是巨大的怀旧冲击
我以为这只是怀旧,但实际上这些游戏保持得很好,特别是考虑到平台的局限性!
当然,与现在移动平台上充斥着交易、广告……的游戏相比,它们真是一股清流。
一位曾经从事J2Me开发的网友表示:
对于诺基亚和索尼来说,应该是可以运行旧模拟器的。
但是对于某些手机来说,比如三星、摩托罗拉,可能很难实现。
除了怀念游戏之外,对于调用GC的问题,也有网友表示同感:
我遇到过这种情况,以前的开发者在C#应用中不断调用GC。这些调用被清理后,性能有了巨大的提升。
不过也有人指出:
Java的GC其实很懒,其暂停(STW)与堆大小(heap size)呈现线性关系。
禁用显式GC会有一段时间的帮助,但一旦它满了,最终会有一个非常长的暂停。
当然,提到经典游戏《毁灭战士 RPG》,不少网友都想在智能手机上体验一把,并且期待卡马克能让它实现。
还有人分享了《毁灭战士》论坛中关于游戏逆向工程的帖子,并且表示这个版本不会发生丢失。
一些网友认为,这些游戏应该都能在Switch实现,还有人想在Switch上做一个BREW复古游戏汇编,并且已经有一些J2ME和iMode了。
你期待再次玩上这些经典游戏吗?
参考链接:
[1]https://twitter.com/id_aa_carmack
[2]https://web.archive.org/web/20060502175605/http://www.armadilloaerospace.com:80/n.x/johnc/Recent%20Updates/
[3]https://news.ycombinator.com/item?id=27220657
[4]https://www.doomworld.com/forum/topic/117360-doom-rpg-reverse-engineering-project/
[5]https://zh.wikipedia.org/wiki
[6]https://www.facebook.com/