第701章 时空幽灵,能够穿越现实时间的BUG(中秋快乐!!!)
第701章 时空幽灵,能够穿越现实时间的BUG(中秋快乐!!!) (第1/2页)你相信这个世界上有幽灵存在吗?
一个能够穿越时间,穿越空间,甚至穿梭在半导体的数字世界里的幽灵。
它能悄无声息地破坏那些原本正常的代码。
即便这个代码从头到尾都没有任何人动过。
在代码仓库里,近一年都没有任何提交。
连字节码哈希值都完全一致。
但它就是坏了。
因为开发组在一个完全无关的新版本里加入了物理引擎。
这……
简直就是一个存在於数码世界的鬼故事。
不过任何一个科学无法解释的现象,或许都只是水平暂时达不到罢了。
有的时候,真相或许并不会满足大家的期待。或许……真相其实非常简单,也非常蠢。
「是……是开着的!」
几人围在电脑前,看着那扇成功打开了的门,啧啧称奇。
「原来是这样……」
林立新坐在跟前,面露异色。
作为一名现代人,其实在上手代码的第一时间,他的脑海中就已经有了大致的猜测。
游戏圈有这样一个潜规则。
如果说游戏里最容易踩坑的是哪两样东西。
那莫过於门和浮点数了。
qake2时期,这扇门是完全可以正常打开的。
即便是门後有npc站着。
这扇门在打开时,碰撞箱会恰好挤到npc的脚,制造一个非常微小的偏移,恰好容纳门正常通过。但在完全没有修改源码里任何一点东西的时候,为什麽这个门突然打不开了?
即便是把硬体回退到nx而不是nf上,仍然是打不开?
其实答案非常简单。
源码一样跟机器码一样完全是两个概念。
amenva上下全体工程师,在开发过程中的主要语言往往就两样。
一个是完全自举,从始至终都是amenva坚实地基的n语言。
一个彻头彻尾的高级语言,大量易用的、现代化的语法,将它武装成了一个专为游戏而生的超级语言。
另一个则是nvascript,为网络世界而生的jit即时编译语言。
而问题就出在n语言这家伙身上。
从《雷神之锤2》到现在这段时间,除了源码外,到底还发生了哪些事呢?
n语言的编译器更新了。
为了适应越来越现代化的硬体,和更多更新鲜的语法糖以及高级语法。n语言几乎每隔一段时间都会推送一次更新。
一台计算机(不管是游戏机还是pc还是掌机),想要运行代码,是不可能直接跑n语言这种高级语言的。
它必须要被编译成机器码,编译成电脑能理解的版本才行。
编译器在处理编译的过程中,本身就会对代码进行一次初步的优化。
把一些不必要的循环解除,不必要的变量改成常量,降低性能的写法改成更高效的写法……
也就是说,最终交给电脑运行的,其实跟程式设计师编写的根本不是同一个东西。
《雷神之锤2》的源码的确从来没有动过。
但编译器更新了。
而这,连锁引发了一个极度不起眼,甚至根本没有人当回事的问题。
浮点数精度变化。
简单来说,就是现在的数字比以前更精确了。
计算机为了性能,或者是为了实现某些必要的数学计算,往往在数字的处理上其实非常鬼畜。就像典中典之《我的世界minecraft》里的边境之地,其实就是一个典型的浮点数误差。
由於整个世界坐标都是用的浮点数的问题,java在这个数字极大的时候,细微的误差会被不断积累放大。
最终便导致了出现各种诡异的扭曲偏移。
在这儿也是同理。
小数点後的几位发生了变化。
所以门打不开了,此案告破。
当众人终於是把这个『穿越时空的幽灵』抓到时,直接被气笑了。
就这样?
真相就这样吗?
人群之中,被临时喊来加班的前地球头号黑客,现役amenva首席安全顾问凯文·米特尼克脑门直冒黑线。
他本期待着展开一场紧张刺激的黑客攻防战。
他们本以为是有一位比林立新还要恐怖的世外高人侵入到了amenva伺服器内,神不知鬼不觉地破坏了源码。「呃……好吧,不管怎麽说,把这次的经验记在员工手册里,不然浮点数的坑以後还不知道要踩多少次。」
哪怕是林立新,此刻也有些无语。
起码还算是一场颇具奇幻色彩的eb之旅。
随着以後物理引擎越来越发达,3化越来越先进,不可避免地一定会频繁跟这些问题打交道。
提前踩踩坑也算是好事。
(本章未完,请点击下一页继续阅读)