你相信这个世界上有幽灵存在吗?
一个能够穿越时间,穿越空间,甚至穿梭在半导体的数字世界里的幽灵。
它能悄无声息地破坏那些原本正常的代码。
即便这个代码从头到尾都没有任何人动过。
在代码仓库里,近一年都没有任何提交。
连字节码哈希值都完全一致。
但它就是坏了。
因为开发组在一个完全无关的新版本里加入了物理引擎。
这……
简直就是一个存在於数码世界的鬼故事。
不过任何一个科学无法解释的现象,或许都只是水平暂时达不到罢了。
有的时候,真相或许并不会满足大家的期待。或许……真相其实非常简单,也非常蠢。
「是……是开着的!」
几人围在电脑前,看着那扇成功打开了的门,啧啧称奇。
「原来是这样……」
林立新坐在跟前,面露异色。
作为一名现代人,其实在上手代码的第一时间,他的脑海中就已经有了大致的猜测。
游戏圈有这样一个潜规则。
如果说游戏里最容易踩坑的是哪两样东西。
那莫过於门和浮点数了。
qake2时期,这扇门是完全可以正常打开的。
即便是门後有npc站着。
这扇门在打开时,碰撞箱会恰好挤到npc的脚,制造一个非常微小的偏移,恰好容纳门正常通过。但在完全没有修改源码里任何一点东西的时候,为什麽这个门突然打不开了?
即便是把硬体回退到nx而不是nf上,仍然是打不开?
其实答案非常简单。
源码一样跟机器码一样完全是两个概念。
amenva上下全体工程师,在开发过程中的主要语言往往就两样。
一个是完全自举,从始至终都是amenva坚实地基的n语言。
一个彻头彻尾的高级语言,大量易用的、现代化的语法,将它武装成了一个专为游戏而生的超级语言。
另一个则是nvascript,为网络世界而生的jit即时编译语言。
而问题就出在n语言这家伙身上。
从《雷神之锤2》到现在这段时间,除了源码外,到底还发生了哪些事呢?
n语言的编译器更新了。
为了适应越来越现代化的硬体,和更多更新鲜的语法糖以及高级语法。n语言几乎每隔一段时间都会推送一次更新。
一台计算机(不管是游戏机还是pc还是掌机),想要运行代码,是不可能直接跑n语言这种高级语言的。
它必须要被编译成机器码,编译成电脑能理解的版本才行。
编译器在处理编译的过程中,本身就会对代码进行一次初步的优化。
把一些不必要的循环解除,不必要的变量改成常量,降低性能的写法改成更高效的写法……
也就是说,最终交给电脑运行的,其实跟程式设计师编写的根本不是同一个东西。
《雷神之锤2》的源码的确从来没有动过。
但编译器更新了。
而这,连锁引发了一个极度不起眼,甚至根本没有人当回事的问题。
浮点数精度变化。
简单来说,就是现在的数字比以前更精确了。
计算机为了性能,或者是为了实现某些必要的数学计算,往往在数字的处理上其实非常鬼畜。就像典中典之《我的世界minecraft》里的边境之地,其实就是一个典型的浮点数误差。
由於整个世界坐标都是用的浮点数的问题,java在这个数字极大的时候,细微的误差会被不断积累放大。
最终便导致了出现各种诡异的扭曲偏移。
在这儿也是同理。
小数点後的几位发生了变化。
所以门打不开了,此案告破。
当众人终於是把这个『穿越时空的幽灵』抓到时,直接被气笑了。
就这样?
真相就这样吗?
人群之中,被临时喊来加班的前地球头号黑客,现役amenva首席安全顾问凯文·米特尼克脑门直冒黑线。
他本期待着展开一场紧张刺激的黑客攻防战。
他们本以为是有一位比林立新还要恐怖的世外高人侵入到了amenva伺服器内,神不知鬼不觉地破坏了源码。「呃……好吧,不管怎麽说,把这次的经验记在员工手册里,不然浮点数的坑以後还不知道要踩多少次。」
哪怕是林立新,此刻也有些无语。
起码还算是一场颇具奇幻色彩的eb之旅。
随着以後物理引擎越来越发达,3化越来越先进,不可避免地一定会频繁跟这些问题打交道。
提前踩踩坑也算是好事。
「欸?说起浮点数误差,我们之前测试的时候还发现了一个问题。」
卡马克一拍脑门,赶快来到工作站前,
「我们做了完整的刚体物理和重力拟真,现在玩家可以拿起场景里的一些物品了,就比如这些桶子,或者这几块板子……」
他说着,将地图里的瓶瓶罐罐捡起,然後丢出去。
尽管整个物理系统的流畅度还有待提升,精度和细节程度也还不算完美。
但对比过去来说,简直就是惊为天人。
一个可以交互的物理世界,那可真的太夸张了。「然後我发现了一个好玩的,你看,我把板子先放在这儿……完事我跳上来,再举起板子,卡好一个视角……」
卡马克操作着角色踩在木板上,按下交互键,将镜头略微微调了一番。
随後……
他狂按跳跃键,整个人居然是左脚踩右脚,直接御板飞上了天。
整个场景的真相顿时便尽收眼底。
除了中间的小房子,其他地方清一色的都是什麽都没有的一片空白。
卡马克倒是玩得很开心。
一旁的项目主管克里斯多福脸上可就挂不住了。
当着林立新的面跟他爆了这麽多b出来,简直就是丢人丢到姥姥家了。
「还没完呢,你看好,我在这个位置把板子和桶稍微堆一下,我试试……上次我直接挤到了地图外面……」
卡马克倒是没心没肺,那叫一个欢腾。
克里斯多福眼瞧卡马克没有停下的意思,继续下去还不知道要整出啥事儿呢,赶忙主动开口道:「目前还是个测试阶段的em,这几天我们的主要目标就是提升精度,这些问题後面肯定都能得到改善的,b很快就能修好。」
「修?你说这个板子飞天啥的吗?为什麽要修?」
林立新不解地偏过头来看向他。
「啊?b不修吗?」
这反问反倒是给克里斯多福整不会了。
不修那不成屎山了?
到时候发出去玩家要骂娘的好吗?
「恶性的b当然要修,但这个……我觉得其实无所谓。」
林立新耸了耸肩,望着玩得正开心的卡马克,
「不要把玩家有趣的举动当做是作弊,如果大家都觉得有意思,那就鼓励他们去胡闹就好了。」
有的设计师,技术不咋地,代码也写得一塌糊涂。
花了大量时间打磨出来了一个堪堪过及格线的作品。然後玩家找到了很多他没有发现的有趣套路,迅速找到了破局之法,把原本艰难的挑战攻克了。
於是他便急了眼。
我这麽用心的设计,你们也必须用心地去玩,不允许逃课。
为了不让玩家玩得这麽开心,浪费了他的艺术才华,他便迅速推出热补丁修复了这个捷径。
本以为这样玩家们就会去体验他那些『精妙的设计』了。
但没想到,玩家们迅速找到了新的套路。
於是他又补,玩家又攻克。
更好用的模组从民间长了出来,修改器成了人手一份的工具。
直到最後,他也会觉得是自己没堵好所有的缝隙,让这些该死的虫子钻了过去。
但他似乎从来都没有意识到一点。
会不会……他所引以为傲的那些东西,本来就不好玩呢?
「如果你对内容有足够的信心,你就没有必要担心玩家们会逃课,因为他们一定会回来的。」「即便他们真的靠着物理引擎的特性逃了课,那也是玩家们自己的自由。」
「永远都不要教玩家玩游戏。」
这也算是林立新的肺腑之言了。
当初《像素战》的时候,就是因为他急於求成,指望引进率土like玩法快速破圈,搞得最後不好收场。
也就是玩家们愿意支持amenva,不然指不定要被骂成啥样呢。
这件事也算是amenva发展史上少有的黑历史了。
事实证明,设计师最大的原罪就是傲慢。
「我们应该做个封闭测试,找一些玩家来体验,如果他们觉得这不影响体验,反而很有意思,那它就不是b,而是……『特性』。」
你说是吧,bjmp?
不管是基於《半条命(半衰期)》、《传送门》、《m》诞生的围绕起源引擎的整个社区。
还是日後《minecraft我的世界》那种真正完全自由的超级沙盒世界。
它们都保留了大量的b。这其中,不得不承认或许的确有不少是因为技术问题没有来得及修复。
但也有很大一部分,的的确确就是为了游戏体验而刻意保留的。
就像mc里,如果修复了tnt复制,那一大票红石生电机械就会原地报废,大量的生电玩家都会放弃更新版本,成为一代遗老。
《m》也会失去它那种肆意妄为的畅快感。