林浩盯著屏幕,看了十分钟。战斗在继续,红蓝双方互有伤亡,但系统稳定。日誌里没有报错,没有警告。一切正常。
他按下ctrl+c,测试停止。屏幕回到控制台。
“起来了。”他说,声音沙哑。
阿坤和王磊没醒。他走过去,轻轻推了推阿坤的肩膀。阿坤猛地坐起,眼镜差点掉下来。
“怎么了?bug?”
“没有。测试通过了。”
阿坤愣了几秒,然后猛地站起,扑到屏幕前。王磊也醒了,揉著眼睛凑过来。
“跑了多久?”阿坤问。
“十分钟。稳定。”
“数据呢?”
林浩调出测试报告。阿坤和王磊凑近看。报告很详细:每秒帧数、网络延迟分布、cpu占用曲线、內存泄漏检测、同步错误率……所有指標都在预期范围內,有些甚至超出预期。
“同步错误率0。003%。”阿坤喃喃道,“比我们目標的0。01%低三倍。”
“內存泄漏每天不到1mb,可以接受。”王磊说,“伺服器连续跑一个月也不会崩。”
三人看著报告,沉默了。房间里只有电脑风扇的声音。
然后王磊突然大笑起来,笑声很大,很嘶哑,像憋了很久终於爆发。
“我操!我们他妈真的做出来了!”
阿坤没笑,但眼睛亮得嚇人。他转头看林浩:“引擎……成了?”
“成了。”林浩说,“浩宇引擎2d,第一版,內测通过。”
阿坤深吸一口气,闭上眼,然后又睁开。他走到白板前,看著上面密密麻麻的公式和架构图。那些是他们过去三个月的心血:从零开始,没有参考,没有文档,全凭林浩脑子里的“未来思路”,加上阿坤的数学推导,王磊的工程实现,一行行代码敲出来的。
“动態光影测试了吗?”阿坤问。
“还没,现在测。”
林浩启动第二个测试场景。这次画面简单多了,只有一个角色站在黑暗中。角色手里拿著一把剑,剑身发出微弱的光。隨著角色移动,光照亮周围的地面,地面是简单的格子,但光影效果很真实:近处亮,远处暗,剑光照到的格子亮,照不到的暗。角色走到墙边,影子投在墙上,隨著剑光晃动。
“这是……”王磊凑近屏幕,“像素游戏能做出这种光影?”
“简化版。”林浩说,“基於距离的光照衰减,加上简单的阴影映射。每个光源计算量不大,但多个光源叠加,效果就出来了。在战斗中,技能特效都可以是光源,火球照亮一片,治疗术是柔和的绿光,闪电是刺眼的蓝白。”
阿坤盯著光影变化,手指在桌上轻轻敲著节奏:“算法是基於辐射度还是光子映射?”
“都不是,太耗性能。我用的距离场+预计算光照贴图。把场景分成网格,预计算每个格子的光照权重,运行时实时混合。虽然精度低,但快,而且2d够用了。”
“聪明。”阿坤说,“用空间换时间,2002年的机器能跑。”
第三个测试:粒子特效。屏幕上,一个角色释放“火雨”技能。天空中落下无数火球,每个火球落地后爆炸,溅射出几十个小火星。火星在空中飞舞,逐渐熄灭。同时,地面上燃起火焰,火焰摇曳,有烟雾升起。虽然粒子都是简单的像素点,但数量多,运动轨跡自然,看起来竟然有几分华丽。
“粒子数峰值多少?”王磊问。
“单次技能释放,最多同时存在五千个粒子。”林浩调出数据,“每个粒子只有位置、速度、顏色、生命周期四个属性,计算量小。但多个技能叠加,粒子数能破万。我们做了粒子合併优化,距离近的粒子合併渲染,减少绘製调用。”
“五千个粒子……”王磊摇头,“《传奇》里一个火墙技能,最多几十个粒子。我们这是碾压。”
“要的就是碾压。”林浩说。
测试进行了两个小时。他们测了所有核心功能:万人同屏、动態光影、粒子特效、天气系统(雨、雪、雾)、昼夜循环、物理破坏(可摧毁的墙体、树木)、音效混音(同时播放上百个音效不卡顿)……
每一项,浩宇引擎都做到了2002年的极限,甚至超越极限。