第 7 章
越过风暴的起锚
控制室的白板上,用红笔圈住了一行字:“PS4帧率崩溃,残余修复时间:48小时。”——这是米哈游在风暴过去之后,第一次面对产品本身给出的直接审判。
字迹潦草,是凌晨三点留下的。白板旁边贴着一张全球发售倒计时表,从东京时间开始,首尔、莫斯科、伦敦、纽约,一圈时区一圈数字,最末一行写着北京时间9月28日上午十点。距离那个时刻,还有三十一天。
引擎组组长把故障报告放在蔡浩宇桌上。报告只有三页纸,附了十几张性能分析图。问题出在PS4的显存分配机制上。开放世界场景的纹理加载量远超引擎在移动端的设计上限,在主机平台上跑起来,GPU显存溢出,画面从每秒三十帧跌到个位数。具体表现为角色在野外奔跑时,远景突然崩成色块,然后画面静止,屏幕上一片高亮的紫,像显存崩溃前最后的错误信号。
这是2020年8月末的一天。米哈游上海总部所在的那栋写字楼,整层灯火通明。工位之间用临时挡板隔开,地上码着一箱箱功能饮料。空调开得极低,有人披着毯子写代码。本地化团队的校对标注密密麻麻,中英日韩四语版本已经合拢,德法西俄的翻译刚刚提交最终稿。
蔡浩宇看完报告,没有立刻说话。他把三页纸从头又翻了一遍,停在性能分析图上。
图上是PS4在璃月地区一段五分钟的跑图测试数据,帧率曲线从第二十秒开始跳水。“验证过多少台机器?”他问。“六台,PS4 Slim和Pro各三台,全部复现。”引擎组长说。“移动端的纹理压缩方案在主机上吃不住。如果降画质,画面效果可能不如PC端的中配。”
这个判断如果放出去,《原神》在PlayStation平台的发行计划就抽掉了基石。索尼对上线游戏有性能审核标准,帧率不稳到这种程度,不可能通过认证。没有认证,就谈不上商店推荐位,谈不上下载量。
更棘手的是时间。原定9月28日的全球同步上线,所有版本必须提前十天完成打包提交。留给技术团队解决PS4崩溃的真实时间,只有两天。
蔡浩宇把报告放到一边,走出控制室,穿过开放办公区,进了刘伟的办公室。
刘伟正在看一份来自索尼互动娱乐的邮件,屏幕上的英文不长,但措辞谨慎。邮件的核心意思明确:PlayStation团队注意到《原神》在玩家群体中引发的争议,希望了解米哈游的应对方案,特别是在内容相似性问题上是否有法务风险评估。邮件最后一句写得颇为微妙——“在进一步确认前,我们暂时无法承诺上线首周的商店推荐位。”
刘伟把屏幕转给蔡浩宇看。两人对视了一眼。这不是索尼在刁难。2020年整个夏天,《原神》都在风口浪尖上。从1月第一次有限测试开始,每一轮放号都在玩家社区引爆争论。到8月,社交媒体上的批评已经形成规模,“抄袭”的标签牢牢贴在游戏身上,任何预告片底下都能看到对比视频链接。平台方有顾虑,合情合理。对于索尼来说,给予一款免费游戏的商店推荐位,意味着平台信用背书。他们需要确认背书的对象不会在上线后转化为法务纠纷。“下午开个会。”蔡浩宇说。“叫上罗宇皓,运营和发行也参加。”
他走出刘伟办公室时,在门口停了几秒。当天下午的会,改变了很多事。会议室不大,挤了二十几个人。白板上写着三行字:“技术:PS4帧率崩溃,剩余48小时。”“平台:索尼推荐位待定。”“营销:是否回应争议。”
这三行字之间没有连线,但所有人都看得懂它们指向同一个问题:推迟上线行不行。
罗宇皓先开口。他的团队负责全球运营,各地时区同步上线意味着各地差异化的商店规则和法律条款必须全部在截止日前满足。日本苹果商店要求额外的年龄认证文件,德国的分级审核比预计延长了一周,韩国网吧协会需要本地服务器压力测试报告。每一件事都没有不能解决的理由,但每一件事都需要时间。
“如果推迟到明年第一季度,”他说,“这些问题都可以从容处理。”他没有提春节假期,但在场的人都懂。每年一月底到二月初,中国整个IT行业几乎停摆。如果9月不上,下一个可行的窗口就是明年二月以后。
刘伟一直在转笔。他没有直接说行不行,而是提了一个问题。“如果推迟,我们对外怎么说?”
会议室安静了几秒。对整个行业而言,《原神》已经是一个高关注度产品。如果说因为技术原因推迟,等于承认团队能力撑不住开放世界在全平台上的落地。如果因为平台关系推迟,等于把决定权交给外部。而不论什么原因,只要推迟,此前积累的所有批评声会立刻找到新的口实:你们果然没做完。半成品的标签会比抄袭更难撕。
蔡浩宇站起来,走到白板前面。他在三行字旁边画了一个箭头,全部指向同一个词:9月28日。“不动。”他说。
这个词不是意气用事。接下来他解释的理由,后来在公司内部被反复传递,几乎成了米哈游早期决策逻辑的一个注脚。“全球同步不是技术问题,是信用问题。”他说。“如果我们连自己定的时间都守不住,玩家凭什么相信我们能守住游戏里答应他们的事?”
信用。这个词他反复用了三次。在蔡浩宇的判断里,开放世界游戏的商业模式本质不是一次售卖,而是长期运营。玩家进来不是买一个产品,而是进入一个会持续更新、持续讲述的世界。这意味着玩家必须信任运营者。这种信任不是靠广告建立起来的,是靠兑现承诺积累起来的。如果连上线日期都无法兑现,“全球同步”这个最大承诺就已经破产。
这就是他后来被称为“情感期货”思路的核心:一次全球同步上线,不是交付一款游戏,而是发行一种叙事信用。这份信用一旦建立,会在此后每一次版本更新中产生复利。反之,如果这次失信,后续所有运营成本都会增加——玩家不会轻易再相信宣传片里标的日期。
刘伟没有反对。他是最早理解这个逻辑的人之一。后来在接受游戏媒体采访时,刘伟提过一个观点:“很多人把我们和传统大厂比技术,技术是可以追的,但信用追不回来。”这句话的出处正是这次会议。
会议的后半段,讨论从“要不要推迟”转向了“怎么不推迟”。刘伟负责营销。他的想法直接:不回应争议。不对对比视频做任何解释。不做正面口碑铺垫。所有预热资源集中到一个点上——让玩家自己上手玩。“解释没有用,”他说,“只有产品能解释产品。”
这个判断来自前几轮测试的数据。测试玩家中,那些玩过两个小时以上的用户,留存率曲线和评价都不同于只看过视频的群体。体验过的人,即使之前带着怀疑进来,也在游戏的前几小时里被开放世界的尺度说服。这种说服不是靠任何话术达成的,是靠游戏本身。刘伟提出,预下载开放时间比上线提前两天。这两天里任何玩家都可以免费下载客户端,等9月28日服务器开启即进入。这意味着全球所有玩家的起跑线是一样的——不存在预购玩家提前进场的优势,也不存在哪个地区先玩的特权。“我们要做的事很简单,”他说,“让全世界的玩家同时、同服、打开同一扇门。”
同服。这个词在当天的会议记录里被圈了出来。全球同服不是技术上的新鲜事,但在《原神》的语境下,它有额外的重量。因为这意味着东京玩家和纽约玩家看到的日落是同一次日落,抽卡池是同一次更新。全球玩家被放在同一个时钟下,这种同步体验在主机和PC平台上并不罕见——但在手游里,这近乎首创。
索尼平台的推进交给刘伟直接对接。他没有再发邮件,而是打了一通跨洋电话。电话的内容没有公开记录,但结果在三天后明确:索尼会在技术审核通过后给予商店推荐位。刘伟向对方承诺的不是法务保障,而是一份技术白皮书——米哈游的引擎架构说明和性能优化方案。他没有说服对方“我们没抄袭”,而是把对方的注意力转移到了一个更具体的问题上:这款游戏值不值得推荐。
剩下的问题是技术。散会后,引擎组全员进入封闭开发状态。PS4帧率崩溃的根因已经定位清楚:移动端纹理压缩方案在主机上的显存占用曲线不同,导致开放世界场景的远景加载时显存溢出。
解决方案不是降画质,而是重构纹理调度逻辑,把远景纹理按优先级分层加载,减少同一帧内的显存占用峰值。这是一台精密手术。远景纹理调度牵涉整个场景渲染管线,改动一处可能引发多个模块的链式反应。
引擎组用了一整夜时间写出动态纹理分配方案,第二天中午提交到测试环境。第一轮测试,PS4 Slim上的帧率回升到每秒二十五帧以上,但Pro版本仍然有偶发掉帧。问题出在Pro的高分辨率模式下。在4K输出时,纹理调度窗口比预期短了大约六毫秒。这六毫秒内,如果玩家在高速移动中切换视角,远景纹理加载速度跟不上,仍然会触发崩溃。
引擎组长后来在行业分享会上提到过这六毫秒。他说,那是他职业生涯最紧张的六个小时。定位这六毫秒花了三小时,修复方案验证又花了三小时。
精确到最后,是在代码里找到一行错误的缓存清理指令——这行指令在常规帧率下不会暴露,只有在高分辨率、高帧率、高速移动三个条件同时满足时才会触发错误。48小时的极限倒计时走到最后六小时,修复补丁通过测试。
PS4帧率崩溃问题彻底解决。此时此刻,距离9月28日全球上线,还有二十九天。八月迈入九月的那些天里,米哈游的办公室没有白天黑夜之分。工位上的屏幕永远是亮的,休息区的沙发上总有人裹着毯子睡一两个小时然后爬起来继续。负责全球运维的团队在墙角搭了一个临时监控台,六块屏幕上实时显示六个时区的服务器压力测试数据。
每一轮压力测试都模拟全服同时在线的链接数,测到第三轮时,数据库响应时间超标了。问题不在计算资源不够,而在跨国数据同步的延迟。
全球同服是真实的物理同服——所有玩家数据存在同一个数据库集群里。但不同地区的玩家接入时,数据请求要经过不同的网关节点,延迟差异导致数据库的读写队列不断重建。最极端的情况出现在美东和东亚玩家同时在线巅峰重叠的窗口,数据库响应延迟会从五毫秒跳到三百毫秒以上。
运维团队提出了一套分区分流方案,在不改变玩家同服的前提下,把数据请求按来源地做优先级化。
这个方案需要改动服务器架构的核心逻辑,但运维组长没有请示“能不能改”——他直接改了一天一夜,然后汇报。测试环境跑通时,延迟曲线压回了安全线以内。
本地化团队在另一侧。十二种语言版本的文本校对是逐句过。翻译不是字面翻译,而是要根据每个角色的人设做本地化改写。日语版本的派蒙声线选定后,试配了三十几个版本。韩语版本的钟离台词涉及大量文言化表达,翻译团队与国内的文案组反复确认原意,再找韩语母语者做语境重构。德语版本因为语法结构差异,有一整段主线剧情的对白需要重写句子逻辑,但意思不能变。每改一处,版本管理工具里就多一个节点。文案组长的电脑上,十二个语言文件夹同步打开,改动日志滚动不停。
蔡浩宇每天晚上固定两个时间点看进度。晚上十点一次,凌晨三点一次。他不催进度,但每次都问同一个问题:“还没解决的有没有。”
到9月第一周结束时,所有语言版本的文本校对基本完成。服务器压力测试通过。PS4版本性能审核提交。索尼在9月9日邮件确认,推荐位按计划安排,位置在商店首页横幅,与另外两款3A大作并列。
这个推荐位是黄金位置。但没有人庆贺。因为整个团队已经在冲刺最后一程——预下载开放窗口即将到来。
9月26日,北京时间晚上八点,东京时间晚上九点,首尔时间晚上九点,《原神》客户端在全平台开放预下载。iOS、Android、PC、PS4四个平台同步上线商店页面。这一刻,刘伟设定的“同服同下载”逻辑开始运转。
预下载数据在二十四小时内突破了一千万次。这个数字传回上海时,是凌晨三点半。刘伟在工位上看到运营发来的实时统计,没说什么,只是把屏幕转给旁边的同事看。
屏幕上跳动的数字来自六个时区,每一个数字增加一次,就意味着又一个地区的玩家正在下载同一个客户端,等待同一扇门打开。9月27日,全球上线倒计时最后deg最后二十四小时。
办公室的白板上,倒计时表已经划掉了前面所有日期,只剩最后一格。白板旁边贴了张新纸,写着应急方案:万一开服瞬间并发超预计峰值,服务器第一波抗不住,各地区的渐进排队机制怎么启动。这个预案做了七个版本。每一个假想情况的触发条件都推演过,从五十万并发到五百万并发,每五十万一个格子。技术团队没有公布过最终准备的承载上限,但参与过那天调试的工程师事后在技术社区提过一句:他们按当时全球注册用户预估峰值再上浮三倍做的准备。
9月27日深夜,蔡浩宇、刘伟、罗宇皓三个人坐在控制室里。监控墙上,各个地区的服务器状态全是绿的,表示就绪。但所有人知道,真正的考试还没开始。第一波冲击将来自东京时间9月28日零点,也就是北京时间9月27日晚上十一点。日本是全球最早进入公测日的时区。
晚上十点半,东京服务器的并发链接开始攀升。预下载用户中,日本地区占比最高。运营组盯着曲线,链接数每秒钟都在跳。控制室里没人说话,只有键盘声和偶尔的电流声。
蔡浩宇站在监控墙前,两手臂交叉,不说话。十一点零分零秒,东京服务器状态灯闪了一下——不是故障,是玩家蜂拥而入时的第一波负载冲击。延迟曲线上跳了一下,然后稳住。同时在线数在十五分钟里从零飙到八十四万,然后进入平稳。
控制室里屏住呼吸。没有人欢呼,因为第一波稳住不代表后续稳住——纽约时区还在睡觉,欧洲时区将在六个小时后开始涌入。
刘伟在看数据面板上的另一个数字:同时在线玩家的地区分布。这个数字证实了一个假设——玩家涌入曲线的峰值真的会随地球自转移动。东京涨完之后是首尔,首尔之后是莫斯科,然后是中东,然后是欧洲,然后越过大西洋。每个时区到了晚上黄金时段,都会起一波新峰值。
到北京时间9月28日上午十点,中国内地服务器开启时,全球同时在线数已经过了八百万。在接下来的六小时里,这个数字继续往上涨。纽约时间晚高峰加入时,服务器顶出了一点小波动,排队机制平滑启动,但没触发任何应急方案。
9月28日全天,没有发生大规模掉线,没有发生数据回档,没有发生任何一例支付故障。PS4版本的玩家反馈中,没有一例帧率崩溃报告。那天晚上,刘伟在社交媒体上发了一条帖,只有两个字:“上了。”
控制室的空调出风口正对那张白板。板上的字是凌晨三点十七分留下的,引擎组长郭林山用红笔圈住“PS4帧率崩溃”六个字时,笔尖几乎戳穿了白板表面。旁边贴的倒计时表被空调风吹得微微卷边,北京时间那一栏被人用荧光笔涂成了黄色。郭林山把三页故障报告放在蔡浩宇桌上之前,已经和索尼的开发支持团队通了四十分钟电话。电话那头是东京的工程师,英语带着口音,但技术判断很明确:这不是常规的性能优化问题。
开放世界场景的纹理压缩方案针对移动端设计,内存池分配策略以ARM架构为基准,移植到PS4的x86架构上,GPU显存管理逻辑出现根本性错配。更麻烦的是,这个问题在项目前期的技术预研阶段没有被识别——因为预研用的是PC端模拟环境,而PC端的显存池是动态扩展的,不会触发PS4上那种硬性上限。
郭林山在电话里试图解释米哈游的引擎架构,但说到一半停了下来。对方的沉默告诉他,这不是沟通问题,而是时间问题。索尼的认证周期是固定的,提交窗口还有十天关闭。如果不能在四十八小时内给出可运行的版本,9月28日这个日期就不在讨论范围内了。他挂了电话,把性能分析图打印出来,直接去找蔡浩宇。
报告的第一页是问题描述。文字很冷静,技术术语排列整齐,看不出任何情绪。但第二页的帧率曲线图暴露了一切:璃月地区跑图测试中,从第二十秒开始,帧率线像被一刀斩断,从三十帧垂直跌到八帧,然后是一条平滑的零线——画面冻结。第三页是显存占用曲线,峰值处被红笔圈出,旁边手写了一个数字:1.7GB。PS4 Slim的可用显存上限是5GB,但系统预留和后台进程占用了将近一半,留给游戏的实际吞吐空间远小于移动端开发时的假设。
蔡浩宇翻完三页纸,问了机型、复现率和初步方案,然后问了一个郭林山没想到的问题。“移动端的纹理压缩方案,当时是谁定的?”
郭林山愣了一下。“我定的。”“理由是什么?”郭林山说,2017年立项时,目标平台是移动端优先。开放世界场景的纹理数据量远超当时任何商业引擎的默认方案,团队自己写了压缩算法,针对ARM芯片的纹理单元做了定点优化。这个决策在当时是对的——如果没有这套算法,《原神》在手机上根本跑不起来。
“现在它在PS4上变成了债务。”蔡浩宇说。这不是指责。郭林山听得出他的意思:技术债务不是错误,是路径选择的后果。2017年做那个决策时,没人能预料到三年后这款游戏要在一个全球同步的窗口里同时登陆移动端、PC和主机。引擎组当时的任务是在移动端上活下来,而不是为一个尚未确定的未来做架构兼容。
蔡浩宇把报告放到一边。他没有说“想办法解决”之类的话。他看着郭林山,说了一句后来在引擎组内部被反复引述的话。“48小时之后,要么我们给索尼一个能跑的主机版,要么我们告诉他们我们做不到。”他说,做不到也可以,但必须基于技术事实承认,不能是因为我们没有尽力。
郭林山回到工位时,引擎组十几个人已经在等他了。桌上摊着打印出来的渲染管线架构图,屏幕上开着性能分析工具的实时监测界面。他们没有开会,直接开始拆问题。
问题被拆成三层。第一层是纹理压缩格式转换:移动端使用的压缩格式在PS4的GPU上解码效率极低,需要转换为BC系列格式,但直接转换会导致纹理尺寸放大,显存占用反而增加。第二层是显存分配策略:移动端是一次性分配大块内存池,主机端必须改为动态分区分配,按场景块优先级调入调出。第三层是远景加载逻辑:原方案在移动端上采用简化远景模型,主机端必须重构LOD距离参数,否则在4K分辨率下远景细节缺失会破坏画面一致性。
三层问题相互耦合,改动任何一层都会影响另外两层。郭林山把组员分成三个小组,每组攻一层,他负责协调接口。工位区里没有人说话,只有键盘声和偶尔的技术讨论,声音压得很低。
这条帖发出去时,控制室里的气氛已经松了下来。有人趴在工位上睡着了,有人去楼下二十四小时便利店买啤酒。蔡浩宇还在看数据,但他看的已经不是今天的在线数,而是今天的新增注册地区分布。这个数字决定接下来一个月的运营节奏,也决定全球化策略的下一个落子。
9月28日过去了。全球同步上线的事实已经完成。但那天晚上坐在控制室里的所有人都清楚,上线不是终点。真正的工作刚刚开始——版本更新、活动运营、社区维护、内容管道,这些才是《原神》作为一个长期产品能否活下去的关键。而活下去了,这场上线才有意义。
零点过后的办公室,灯火还亮着。窗外上海的城市灯光已经在渐渐暗淡,但里面的人没走。键盘声还在响,监控屏还在刷新。运维组的组长在检查下一轮压力测试的时间表,本地化团队开始整理玩家在各地区的首批反馈,引擎组已经在处理下一个版本的优化方案。控制室的白板上,倒计时表被一只黑笔划掉了最后一格。旁边应急方案贴在原处,没派上用场。
而桌上,放着一份新的档期计划——版本1.1的更新内容清单。日期栏里标着:2020年11月11日。只隔了四十四天。蔡浩宇从控制室走出来时,在走廊里站了一会儿。走廊尽头的窗户外,天还黑着,城市的边缘已经透出极其微薄的天光。他转身走回办公室,门在身后轻轻关上。里面键盘声又响了起来。