这单生意的主顾是佛罗伦萨大学一位政治学教授和他的学生们。一窝蚁 m.yiwoyi.com姜若对接到这类生意并不意外——每一篇science重磅文章都意味着新鲜出炉的学术热点,科学家也是很擅长蹭热点的;只是有点意外来得最快的是一帮意大利人——毕竟蹭热点这种事情,我国人民还从没有输过。
但等姜若看到对方一并发来的各种材料扫描件,尤其是伦理审核时就了然了:国内现在正在舆论风暴口上,没几个课题组敢在这个风口浪尖撞在人民群众的悠悠众口上面,落下一个蹭遗忘症的热点吃人血馒头的可怕名声;但外国人不同,对生命他们其实有一种我们不能理解的漠视,用自己的生命冒险做危险实验什么的,大约也是公民的自由之一。
姜若对佛罗伦萨的唯一认知是那里离据说每年要过圣马库斯节的沃特拉城很近——圣马库斯节是庆祝驱逐吸血鬼的节日——于是他幽默地考虑在“不周山”找一面墙壁涂一幅吸血鬼主题的壁画以示欢迎。
怎么看这都是一单十拿九稳的生意。
姜若这么想着,启动了久违的“不周山”,准备例行跑一跑,替主顾打个前站。空无一人的校园诡谲依旧,像一片满目疮痍的古战场遗迹。姜若巡视一圈,没有发现异常,又进了物理大楼,准备把实验室一间一间排查一下,看看有没有以前玩家留下的什么陷阱——万一主顾们在这里发生流血事件,落下ptsd就不好了。
熟读过玩家日志,姜若深知玩家在恶作剧上的不遗余力,有些陷阱藏得很隐秘,只有触碰到特定机关才会触发。平日里姜若不是个手贱的人,但为了排雷,他把所有仪器都启动检查了一遍,还真找到了几个不大不小的机关,其中一套蒸馏装备里面塞满了番茄酱,一点火就疯狂地对着屋顶喷射,不知道是哪个玩家的恶趣味。
然而就在姜若哭笑不得等着番茄酱停止喷射时,空气中悬浮的液滴忽然静止不动,与当初“山海经”因为秋城山火卡掉线的情况如出一辙——卡了几秒钟后,姜若遭遇了闪退,当他从游戏仓里爬出来,看着运行窗口跳出的oom错误提示,整个人登时陷入了懵逼中。
outofme摸ry,内存溢出,是几乎每只程序猿都见过的经典bug。
运行出现了bug,照说没有什么奇怪的,然则虽然姜若和普天之下所有程序猿一样,写出来的代码天天报错,但在他心目中顾荻就是神,所以看见顾荻写的游戏居然也有bug时,有一种碰见耶稣跟你一个澡堂洗澡的难以置信感。
姜若从来没有想过自己有一天要帮顾荻debug。生活真奇妙。
经典的bug往往对应经典的debug套路。姜若查了一遍内存分配,很快发现了症结所在:“不周山”的内存分配方式和“山海经”是不同的。如果把“不周山”的所有内存看作一个正方体,那么其中所有细节就是这个正方体的无限分割。比如分割出一块来模拟一条鱼,再在这一小块里分割出存储鱼鳞和鱼骨信息的部分,鱼鳞中有坚硬的上皮细胞,细胞里有蛋白质......
在模拟不断细分的时候,内存也不断被分割。可是内存有限而细节无限,当“不周山”的模拟精度达到一定程度时,就会出现试图把一个字节继续分割的情况,那么自然就发生了报错。在金叶服务器上运行过的“不周山”已经具备了更高的计算精度,再回到古董电脑簇上面发生内存溢出也就不足为怪了,这大概就是所谓的曾经沧海难为水。
而“山海经”则不同。“山海经”每一帧都会重新分配内存,确保将所有内存调用在玩家关注的地方,而没有被关注的地方则尽可能模糊处理。只有你视野里有一整条鱼的时候,才会存储整条鱼的信息,而当你开始剔鱼刺,会存储这根鱼刺的信息,你没有关注的鱼鳞鱼头鱼尾就模糊化了,仿若一个虚化的镜头,焦点和边缘的像素截然不同。
所以“不周山”保留着完整的场景,而“山海经”的最后一帧信息事实上是最后被踢下线的所有玩家观察到的信息,是无数盲人在不同的位置和角度一起摸象,由他们得出的图景拼接的结果。
修正这个bug并不困难,只要改回“山海经”的内存分配方法就可以了。但姜若觉得顾荻不是会犯这种显而易见错误的人。他意识到,顾荻使用的内存分配方法,是
四十八 最后一个BUG