延迟明显,有卡顿,但能玩。
“还不够。”林浩说,“要加预测和矫正。”
阿坤拿出了他今天的成果:三页纸的预测算法伪代码。林浩看了,思路清淅,但实现复杂。
“我们分步来。”林浩说,“先实现最简单的:客户端预测移动,服务端矫正位置。技能和伤害先不做预测,等同步。”
“行。”
又写了两个小时。凌晨一点,预测移动完成了。测试时,故意加了300毫秒延迟。红色小人在客户端移动得很流畅,但在服务端的视角里,它有轻微的“飘移”,会突然跳到正确位置。这是预测错误的矫正。
“视觉上有点怪,但能接受。”王磊说。
“恩,先这样。”林浩说,“今天到此为止。明天做技能预测和伤害同步。”
三人瘫在椅子上。累,但兴奋。他们用一天时间,做出了一个可用的战斗引擎骨架。虽然简陋,但架构先进,有扩展性。
“老大,”王磊突然说,“你脑子里的这些东西,到底从哪学的?”
林浩沉默了几秒。窗外是沉沉的夜,没有月亮,只有几颗星星。
“如果我说,我梦见过未来,你信吗?”
王磊笑了:“我信。不然没法解释。你写的这些设计,我从来没见过,但仔细一想,又觉得就该这么设计。象是……站在山顶看山路,知道哪里该拐弯,哪里该直行。而我们还在山脚下摸索。”
阿坤轻声说:“我也有这种感觉。你给的算法思路,不是凭空想的,是经过千锤百炼的最优解。但你又没时间千锤百炼。”
林浩没回答。他关了计算机,站起身。
“睡觉。明天六点起。”
“六点?!”王磊哀嚎。
“恩,六点。我们只有两周了。”
三人简单洗漱,躺下。工作室里只有两张行军床,林浩睡地铺。硬地板,但累到极致,躺下就着。
第二天,六点,闹钟响。
三人爬起来,用冷水冲脸,泡面当早饭,然后继续。
第二天,做技能预测。更难,因为技能有前摇、弹道、命中判定,任何一步预测错误,都会导致严重的不同步。林浩设计了“预测-验证-回滚”机制:客户端预测技能命中,如果服务端验证不通过,就回滚到上一个状态,并补偿玩家。
实现这个机制,又花了一天。到晚上时,他们终于能在高延迟下,比较流畅地释放技能了。虽然偶尔会有“技能打中了但没伤害”或者“没打中但跳伤害”的bug,但概率很低。
第三天,做状态同步优化。阿坤实现了状态快照差分压缩,把每次同步的数据量从2KB降到了200字节。这意味着,在56K的拨号网络下,同步延迟能从500毫秒降到100毫秒。这是质变。
第四天,做AI。简单有限状态机,但林浩添加了一些小技巧:AI会走位,会逃跑,会吃药。虽然还是很蠢,但比《传奇》里那些站桩怪强多了。
第五天,集成。把战斗引擎、网络层、AI、资源管理全部集成到一起。出了无数bug,修到凌晨三点。
第六天,第七天,第八天……
每天睡四小时,吃泡面,喝矿泉水。工作室里堆满了草稿纸、泡面盒、空水瓶。三人的胡子长了,头发油了,眼睛红了。但代码一行行增加,功能一个个实现。
到第七天晚上,他们有了一个可玩的de:一个简单的战场,玩家控制一个角色,可以移动,释放三个技能(火球、治疔、冲锋),打五个AI怪物。有血条,有蓝条,有经验值,有升级。虽然美术只有简陋的象素图,虽然音效只有“噗噗噗”的简单音效,虽然内容少得可怜——
但它流畅。
在仿真的200毫秒延迟下,移动流畅,技能释放流畅,战斗流畅。没有卡顿,没有漂移,没有明显的不同步。这在2002年,是奇迹。
王磊控制角色,在战场上跑了一圈,放了几个技能,打死一个怪。他盯着屏幕,看了很久。
“我操。”他说,声音很轻。
阿坤也盯着屏幕,手指在颤斗。
“我们……做出来了?”他问。
“做出来了。”。”
三人坐在计算机前,看着屏幕。红色的象素小人在简陋的地图上奔跑,释放火球,怪物倒下,经验条增长。
很简单,很粗糙。
但它是完全基于全新架构的,是他们三个人,用两周时间,从零写出来的。
“接下来,”林浩说,“我们要在两周内,基于这个引擎,做出《浩宇传奇》的第一个版本。内容要足够多,能让玩家玩上一天。美术要看得过去,不能太丑。运营后台要简单,能开服,能收钱。”