钱湖观邸,蜉蝣科技工作室。
三排长桌坐满了人,显示器上全是代码、模型、引擎界面,键盘声此起彼伏,像雨打芭蕉,空气里混着咖啡、黄金叶的味道。
湖面的碎金从落地窗映照进来,落房间在天花板上。庄晓生站在白板前,手里拿了半罐咖啡,白板上画满了架构图,红线蓝线交错,中间一个大大的问号,他盯着那个问号,一动不动。阿杰坐在他左手边,手指在键盘上悬着,不敢敲。小宇站在白板另一侧,抱着胳膊,眉头拧成川字,小七从她的显示器后面探出头,用绘图笔点着桌面,“我那边的场景加载已经优化到临界值了,再压就会掉帧。你们引擎层的GC能不能别在剧情场景触发?一卡一卡的,美术的心血全白费。”
“已经调了优先级,但还是会在内存水位线触发。”阿杰的声音带着疲惫,“底层引擎的内存管理是晓生写的,我不敢乱动。动了怕崩。”
所有人的目光转向庄晓生。他没有回头,盯着白板,手指在杯上无意识地摩挲。
“不是GC的问题。”他说,声音不大,但所有人都在听。
“是触发时机。我们一直在等内存满了再清,为什么不能提前清?”
小宇愣了一下。“提前清?怎么提前?玩家不知道什么时候会进入场景。”
“玩家不知道,但AI主机知道。”庄晓生转过身,看着阿杰。“阿杰,你把场景的预加载标记提前。在玩家进入剧情区域前两百米,就触发资源预加载。结束后的场景切换也同理,提前三百米卸载。”
阿杰眼睛亮了。“你是说,把GC触发点从内存水位改成场景节点?”
“嗯。场景节点是可控的。内存水位不可控。”庄晓生走到小宇的机器前,调出引擎的profile数据,指着那条锯齿状的内存曲线。“你看这里,每次GC都卡在剧情触发点。不是因为内存满了,是因为我们加载资源的时候,刚好撞上GC。把GC提前到剧情触发前,玩家在跑图的时候卡一下,总比过剧情的时候卡好。”
小宇猛拍了一下大腿。“对!我他妈怎么就没想到!”
“因为你没想过。”阿杰幽幽地说。
小宇瞪了他一眼,阿杰已经缩回屏幕后面了。
庄晓生没有理会他们的斗嘴,走回白板前,拿起笔,在那个问号后面写了一个字:解。然后画了几条线,把新的GC触发逻辑框出来。他画得很快,笔触果断,没有一笔犹豫。
“阿杰,你按这个思路重构内存管理模块。小宇,你配合调整剧情场景的资源加载策略。阿七,你把场景预加载标记补上。今天下班前出一个测试版,跑一轮压力测试。明天我看数据。”
“今天下班?”阿杰看了一眼窗外正在下沉的夕阳。“晓生,今天周六。”
庄晓生停下笔。“周六怎么了?”
“周六晚上……”阿杰张了张嘴,看了一眼小宇,又看了一眼阿七,三个人交换了一个心照不宣的眼神。
“你们几个又要去活动是吧?”庄晓生反应过来。
“嗯嗯嗯,你要不一起?”几人眼神热切。
“你们去吧,我把程序再跑跑”庄晓生挥挥手,几人赶紧开溜。
庄晓生把白板笔放回槽里,走回自己的工位,他的工位在最里面,背靠窗户,桌上堆着打印出来的论文、引擎设计草稿,面前是三排显示器。中间那台最大,三十二寸,屏幕上是一行一行的代码,正在滚动编译;两侧的显示器小一些,铺着三张曲线图——内存占用、帧率波动、量子噪声频谱。三条线的颜色分别是绿、黄、红,在黑色的背景上跳动着,像三根心电图,显示器旁边放着一个相框,里面是一个女孩的照片。
“迪哥,把程序跑一遍”庄晓生向AI伙伴发出指令,手指在键盘上敲下最后一行提交,按下回车键,发出了一声清脆的“咔”,像是琴键被按下,又像是扳机被扣动。
屏幕上的光标跳动了几下,然后整个工作室的灯光暗了一瞬——AI伙伴迪哥接管了环境控制系统,三块主显示器同时亮起,中间那块开始滚动一行行代码,速度很快,快到人的眼睛根本跟不上,只能看到一行一行的字符像瀑布一样从屏幕顶端倾泻下来,在视网膜上留下一道一道的残影。两侧的屏幕则铺开了三张不同的曲线图:内存占用、帧率波动、量子噪声频谱,从最左边开始,一条线向右延伸,像三条不同颜色的蛇在黑暗中爬行。
“请确认具体程序”迪哥的声音从四面的音响里传出来,“是单元测试、集成测试、压力测试?”
“迪哥,你觉得自己能活到公测那天吗?是今晚所有重新编译过的程序。”庄晓生端起旁边凉透的红茶喝了一口,目光盯在中间屏幕上那片正在编译的代码流上。
“好的,马上执行”
庄晓生靠在椅背上,看着屏幕上那些滚动的代码。它们还在滚,一行接一行,像一条不知疲倦的河流。突然,屏幕上的代码流加速了。从瀑布变成了洪流,速度快到字符连成了线,线连成了面,面变成了光。三张曲线图的刷新频率也加快了,从每秒一次变成了每秒十次,绿色的线、黄色的线、红色的线在屏幕上疯狂地跳动着,像三颗失控的心脏。
过了半小时,响起迪哥的声音“程序已编译完成,是否运行?”
庄晓生戴好VR头盔,说到“运行”,眼前出现屏幕,界面显示: