第15章 浩宇引擎2D初版
十月的县城已经有了凉意。梧桐树叶开始发黄,风一吹,簌簌地落。街上的行人穿上了长袖,早晨的雾气要到十点才散。
浩宇工作室的窗户开著,但没人觉得冷。三台电脑屏幕亮著,主机风扇嗡嗡地转,散发出的热量让房间里暖烘烘的。墙上的白板写满了公式、架构图、待办事项,有些字跡已经被擦掉,但痕跡还在。地上堆著泡麵盒,墙角的水箱空了,桌上散落著草稿纸、铅笔、橡皮、直尺。
阿坤趴在桌上睡著了,眼镜歪在一边,手里还握著一支笔。王磊仰在椅子上,张著嘴,鼾声轻微。林浩坐在中间,盯著屏幕,眼睛里布满血丝。
屏幕上是一个黑色的控制台窗口,绿色的字符在滚动:
[info] 浩宇引擎2d v1.0 內测版
[info] 初始化完成
[info] 加载地图: test_world_01
[info] 加载角色: 10000
[info] 加载技能: 50
[info] 加载特效: 200
[info] 网络连接: 已建立
[info] 伺服器状態: 正常
[info] 准备就绪
下面是一行闪烁的光標,等待输入。
林浩的手指放在键盘上,微微发抖。不是紧张,是累。他们已经连续工作了七十二小时,这是內测前的最后衝刺。引擎的核心代码上周就写完了,但调试、优化、集成,花了整整七天。七天里,他们睡了不到二十小时。
他深吸一口气,敲下回车。
> start_test scenario_001
屏幕刷新,新的一行行日誌弹出:
[test] 开始测试场景001: 万人同屏战斗
[test] 生成角色: 10000/10000
[test] 分配阵营: 红方5000, 蓝方5000
[test] 初始化ai: 完成
[test] 启动同步: 完成
[test] 开始模擬...
屏幕上出现了画面。是一个简陋的2d战场,俯瞰视角。左侧是红色阵营,右侧是蓝色阵营,各五千个像素小人,密密麻麻,像两片不同顏色的蚂蚁。战场中央有一条河,有桥,有树林,有丘陵。地形是简单的色块,但能看出高低差。
没有声音,只有画面。一万个小人在移动,红色的向蓝色衝锋,蓝色的向红色迎击。在河桥上相遇,开始混战。技能特效亮起:火球是红色的圆圈,治疗是绿色的十字,衝锋是黄色的箭头。虽然只是简单的几何图形,但数量多了,竟有种壮观的、混乱的美。
屏幕右下角显示著实时数据:
fps: 58/60
角色数: 10000
网络延迟: 35ms
cpu占用: 78%
內存占用: 312mb
丟包率: 0.02%
fps稳定在58帧,偶尔掉到55,但很快恢復。网络延迟35毫秒——这是区域网环境,实际公网会高,但他们优化了同步算法,200毫秒以內玩家感受不到卡顿。cpu占用78%,內存312mb,在2002年的机器上,这是极限了。但最重要的是,它跑起来了。一万个角色,同屏战斗,不卡,不崩,不不同步。
林浩盯著屏幕,看了十分钟。战斗在继续,红蓝双方互有伤亡,但系统稳定。日誌里没有报错,没有警告。一切正常。
他按下ctrl+c,测试停止。屏幕回到控制台。
“起来了。”他说,声音沙哑。
阿坤和王磊没醒。他走过去,轻轻推了推阿坤的肩膀。阿坤猛地坐起,眼镜差点掉下来。
“怎么了?bug?”
“没有。测试通过了。”
阿坤愣了几秒,然后猛地站起,扑到屏幕前。王磊也醒了,揉著眼睛凑过来。
“跑了多久?”阿坤问。
“十分钟。稳定。”
“数据呢?”
林浩调出测试报告。阿坤和王磊凑近看。报告很详细:每秒帧数、网络延迟分布、cpu占用曲线、內存泄漏检测、同步错误率……所有指標都在预期范围內,有些甚至超出预期。
“同步错误率0.003%。”阿坤喃喃道,“比我们目標的0.01%低三倍。”
“內存泄漏每天不到1mb,可以接受。”王磊说,“伺服器连续跑一个月也不会崩。”
三人看著报告,沉默了。房间里只有电脑风扇的声音。
然后王磊突然大笑起来,笑声很大,很嘶哑,像憋了很久终於爆发。
“我操!我们他妈真的做出来了!”
阿坤没笑,但眼睛亮得嚇人。他转头看林浩:“引擎……成了?”
“成了。”林浩说,“浩宇引擎2d,第一版,內测通过。”
阿坤深吸一口气,闭上眼,然后又睁开。他走到白板前,看著上面密密麻麻的公式和架构图。那些是他们过去三个月的心血:从零开始,没有参考,没有文档,全凭林浩脑子里的“未来思路”,加上阿坤的数学推导,王磊的工程实现,一行行代码敲出来的。
“动態光影测试了吗?”阿坤问。
“还没,现在测。”
林浩启动第二个测试场景。这次画面简单多了,只有一个角色站在黑暗中。角色手里拿著一把剑,剑身发出微弱的光。隨著角色移动,光照亮周围的地面,地面是简单的格子,但光影效果很真实:近处亮,远处暗,剑光照到的格子亮,照不到的暗。角色走到墙边,影子投在墙上,隨著剑光晃动。
“这是……”王磊凑近屏幕,“像素游戏能做出这种光影?”
“简化版。”林浩说,“基於距离的光照衰减,加上简单的阴影映射。每个光源计算量不大,但多个光源叠加,效果就出来了。在战斗中,技能特效都可以是光源,火球照亮一片,治疗术是柔和的绿光,闪电是刺眼的蓝白。”
阿坤盯著光影变化,手指在桌上轻轻敲著节奏:“算法是基於辐射度还是光子映射?”
“都不是,太耗性能。我用的距离场+预计算光照贴图。把场景分成网格,预计算每个格子的光照权重,运行时实时混合。虽然精度低,但快,而且2d够用了。”
“聪明。”阿坤说,“用空间换时间,2002年的机器能跑。”
第三个测试:粒子特效。屏幕上,一个角色释放“火雨”技能。天空中落下无数火球,每个火球落地后爆炸,溅射出几十个小火星。火星在空中飞舞,逐渐熄灭。同时,地面上燃起火焰,火焰摇曳,有烟雾升起。虽然粒子都是简单的像素点,但数量多,运动轨跡自然,看起来竟然有几分华丽。
“粒子数峰值多少?”王磊问。
“单次技能释放,最多同时存在五千个粒子。”林浩调出数据,“每个粒子只有位置、速度、顏色、生命周期四个属性,计算量小。但多个技能叠加,粒子数能破万。我们做了粒子合併优化,距离近的粒子合併渲染,减少绘製调用。”
“五千个粒子……”王磊摇头,“《传奇》里一个火墙技能,最多几十个粒子。我们这是碾压。”
“要的就是碾压。”林浩说。
测试进行了两个小时。他们测了所有核心功能:万人同屏、动態光影、粒子特效、天气系统(雨、雪、雾)、昼夜循环、物理破坏(可摧毁的墙体、树木)、音效混音(同时播放上百个音效不卡顿)……
每一项,浩宇引擎都做到了2002年的极限,甚至超越极限。
测试结束时,天已经大亮。阳光从窗户照进来,落在满是灰尘的地板上。三人坐在电脑前,看著最后的测试报告。
“总结一下。”林浩说,声音很平静,但手在抖,“浩宇引擎2d v1.0,核心特性:”
“一,支持万人同屏实时战斗,同步延迟200毫秒以內,同步错误率低於0.01%。”
“二,简化的动態光影系统,支持多个实时光源,性能开销可控。”
“三,高效的粒子系统,单场景可同时存在上万个粒子,支持合併优化。”
“四,內置天气、昼夜、物理破坏等环境交互。”
“五,资源热更新,无需重启客户端即可更新地图、角色、技能。”
“六,跨平台支持,目前適配windows 98/2000/xp,后续可移植到linux。”
“七,完整的工具链:地图编辑器、角色编辑器、技能编辑器、粒子编辑器。虽然简陋,但能用。”
他说完,房间里很安静。只有远处街道上传来的车声,人声。
“我们做到了。”阿坤轻声说。
“我们做到了。”王磊重复,然后笑了,笑著笑著,眼眶红了,“他妈的我三个月没出这个门,没洗过澡,没吃过一顿正经饭。但我做到了。”
林浩看著他们。阿坤瘦了至少十斤,脸上的颧骨凸出来,但眼睛很亮。王磊的鬍子长得像野人,头髮油腻得打綹,但背挺得很直。他自己呢?不用照镜子也知道,肯定好不到哪去。
“今天休息。”林浩说,“洗澡,吃饭,睡觉。明天开始,我们要用这把刀,去屠龙了。”
“屠谁?”王磊问。
“《传奇》。”林浩说,“但不止《传奇》。所有用老旧引擎、体验粗糙、外掛横行的2d网游,都是我们的目標。我们要告诉他们,2002年的技术能做到什么程度。我们要重新定义2d网游的標准。”
阿坤点头:“引擎有了,接下来是游戏內容。《浩宇传奇》的开发,可以全速推进了。”