现在正在开发一个MMOSLG的手游,最近公测了,本来是挺让人期待,可是前两天由于一个对象的key引发了一场血案。
那天周六,照常加班到晚上六点下班。回到宿舍,吃了个饭,休息到八点,刚想玩一会游戏,接到客服电话,说有玩家丢兵丢将了(就是把城中部队派出去了,但是再也没回来了)。于是乎就匆忙打车到公司(将近八点半到的),毫无疑问,先去查了一遍报错日志,结果并没有发现什么有价值的东西。于是乎,没办法,只能去查代码,粗略看了一遍没啥问题,但是结合游戏日志,可以查到是在哪个阶段出的问题,反复读那个阶段的执行代码,终于发现有个对象用来保存玩家部队(object[key] = troop),咋一看,好像没啥问题,但是认真看了一下,那个key是一个时间time,并且那个time的时间精度是一秒,这样就导致同一秒进入这个执行逻辑的玩家,只会有一个被保存,因此就出现了其他人部队丢失的事件。
知道问题出现在哪里了,作为程序,改起来当然很简单,这个过程就不细说。然而事情并没有就这么结束,更加复杂的事情还在后面。
程序问题改了,但是玩家问题还没处理,玩家很多都是充钱玩的,有好几个还是充了好多钱的。那么问题来了,有些玩家部队丢了,甚至是由于部队丢了,导致老家没有防守力量而被攻击,造成了不小的损失。这个时候,我们就得赔偿玩家了,策划和产品研究后,让我统计了一番玩家数据,把出现丢兵丢将的玩家以及他们丢兵丢将后的战争损失全部算了一遍。然后就去翻数据库,查各个表,想办法把他们要的数据给弄出来,把所有数据取出所有数据后,写了个脚本,把这些数据过滤处理了一遍。完事之后,就开始处理了。首先先服务器在线更新,把bug解决了,之后就是处理玩家的情况,先把玩家丢的部队给他弄回去,然后呢就是把玩家由于丢部队被打的损失,给补回去。对于全部玩家给予一定的补偿,对于丢兵丢将的玩家给予额外的补偿。事情好像很简单,大概在凌晨一点的时候全部操作完毕,然后就回宿舍了,刚回宿舍,又收到通知,玩家进不去服务器了,心里很忐忑,该不会是刚刚自动更新导致的问题吧,没办法,又打车回公司,结果发现,不是游戏问题,是机房网络断了,然后就通知运维,等运维处理好,回到家里,大概就两点了。通知测试第二天上班,测试一下新提交的东西(事情比较紧急,测试家里又比较远,所以就先更新出去了)。
第二天早上十点,程序测试准时到公司,开始测昨天的修改。结果客服就来反应了,说玩家来反馈了,尤其是那些大R,都在闹退游。我也有玩游戏,其中一个大R就是我们帮派的,看了他在帮派管理员群里面说的,他也想退游了,吓死我,他怎么可以退游,然后紧急通知产品,产品要了玩家电话,好说歹说,又是讨价还价,又是被玩家威胁的,总之,其中的滋味,真是苦不堪言。虽然最后勉强把玩家留了下来,但是发现大家已经热情大减了,都基本可以让人感觉整个服快要废了。大概就是这样,一个bug,导致游戏质量深受质疑,使玩家超级不爽。
所以,作为一个程序,必须不能大意,也许有一天,你写的一个小bug,会让整座大山倒下,全军覆没。