« 无言 | 返回首页 | 那些日子(十六) »

那些日子(十五)

大话西游 2.0 在 02 年五一封闭内测的时候,已经更名为大话二。因为丁觉得,反正是重新做的,就应该以新名字重新来推广。

由于先前的刘铁等几个策划离开,月心被调离大话组,转到 3d 项目中(这也一定程度的导致了这个 3d 项目最终被命名为天下二)。Micro 在他回加拿大前的一个月,开始重新为游戏策划招兵买马。

萝卜从大话西游的界面设计师改行做游戏策划,黄华被提升为大话西游的主策划。而丁丁(日后的《梦幻西游》产品经理)就是这个时候入职网易的。这是 2002 年四月间的事情。

按我讲述这个故事的前后习惯,所有提到的人均用我平时在公司对他们的称呼。那么就用丁丁代这么个人了(有人也把丁磊称作丁丁,不过不是我的习惯)。公司里也有人称他为老妖,那是他的一个网名吧。

丁丁总是带着一副彩色的眼镜,年龄看起来比实际上的小许多。在当时的游戏开发团队里,只有 dingdang 比他年长一点。他从学校里出来的早,所以工作经历比其他人要多许多。据说早年卖过花,早早的起来去花市里,把花架在自行车上运出去卖,收入还不错;后来手工焊过线路板,做数控机床的驱动电源,赚了不少钱 …… 也算是久经江湖了吧。

那一年末他又离开网易,但不久以后再次回来,一直做到现在,已经是游戏部门的领导了。

这段时间有前同事跟我在泡泡上聊,说怀念过去的工作经历,想再回来网易,但是又担心回去后受到不公正的评价,影响日后的发展。其实中途离开过公司,之后又回来的的例子很多很多。在这个故事里提到的人中就有 ruiheng 和丁丁。我现在也管理一个团队了,从内心中感到,其实用人往往还是希望更熟悉点,所谓知己知彼,百战不怠。大多数领导团队的人,还是希望那些自己离开的同事可以回来继续共事的。何况周而复返,更能说明经过了深思熟虑。

丁丁来的那一晚,Micro 叫我一起去吃饭,说要给新朋友接风。饭局不太隆重,我们就在工业园中的明记大排档吃的。天气开始有点热了,老板说屋子里有空调,大家就坐进去。我跟丁丁之前没有见过面,但是一聊起来发现还有点缘分。他是《古龙群侠传》的数值策划,那么就是郭伟的老同事了。我们立刻就有了共同话题。


大话二的 client 放出后,作为引擎开发者,我已经没太多事情。我给自己找了些事情做,那就是想方设法减少外挂和加速器对游戏的危害。

外挂问题,是一个长期的处理过程,前后持续投入了一两年。但都是断断续续的在做。灵感来了,添点东西,从来不是我的主要工作。相关的一些方面,前面已经谈起过,不再累赘技术细节。下面简单提一下加速器的监测。

所谓加速器,就是让 client 以高出常规频率向 server 发送一些指令包。早期的 MMORPG 服务器都是单纯的包驱动,即,根据 client 发送过来的指令,在检查了逻辑合法性后,做出相应的处理以及反馈。大多数网络服务都是这么做的,比如 web server 用的 http 协议就是这样。用户从浏览器发起一个请求,服务器就做出一个回应。普通的网络服务仅仅在防止恶意攻击时,才限制一下同一处来的并发请求数。但 MMORPG 则不够,因为时间信息也是影响游戏规则的一部分,我们需要保证时间间隔信息的合法,以此维护游戏公平。另一方面,也要阻止非法用户吃掉过多的 server 带宽和 cpu 资源。

今天看起来很简单的道理,当时我并不是一开始就意识到的(虽然着手处理加速器的工作更早就开始做了)。最早是 tarcy 给我讲的一件事,让我意识到这个问题的严重性。

tarcy 在九城测试《奇迹》时就开始为这个游戏写外挂了。我一开始很奇怪,不是说《奇迹》的战斗逻辑都放在服务器计算的吗?那么就不再会出现《精灵》那种修改 client 就能做到无敌天下的问题。使用外挂又有什么特别的好处呢?tarcy 说他们写的外挂很好用,可以让火球提高最高八倍的攻击力。一开始我不相信,他一解释就明白了。原来只是提高的发火球的频率而已。(btw ,tarcy 的奇迹外挂后来据说达到六位数的注册用户,还发展了海外代理,赚了个钵满盆盈 :D 如果单单是个人想赚点钱,这比为网游写程序要来的容易多了)

后来 wow 是用技能冷却 ( CD : Cool Down) 时间来回避这个问题的,这也是欧美系网游一贯传承下来的方法。今天被很多游戏学了去,但那个时候却不普遍。

最开始,我去解决加速器引起的问题,只是想阻止玩家用不合法的手段在虚拟场景中移动的比正常速度快,也就是避免玩家以非法的频率发送移动指令。玩家做到这一点,甚至不需要修改 client 程序。他只需要用一个小软件修改操作系统的时钟逻辑频率即可,这样的软件比比皆是,被称为变速齿轮。

我们的服务器程序设计的并不好,mudOS 的底层也没有精确控制时间的设计。在做这件事情时,和通讯加密一样,我尽量避免要求服务器做大的修改。

方法是很简单的,就是在通讯底层加上时间戳。也就是在时间流逝后,发送一个时间信息包,通知 socket 上的对方自己本地的时刻。理论上,socket 两端的时间流逝速度应该是一致的。假设一开始通讯时,client 和 server 的时刻校对一致,由于网络通讯需要消耗一段时间,所以,server 收到的 client 发送的时间戳时,时间戳表示的时刻都应该比本地时间慢一些。一旦快于本地时间,就可认为 client 在作弊。

这个方法很多游戏开发团队都想到了。

头一年(01 年)国庆的时候,我曾经去上海拜访过新浪游戏论坛上的一群网友。小箭2000 带着 freemind ,analyst ,softboy 等一帮人在上海为金智塔做《星河贝贝》。那是个下午,小箭的电话始终没有人接。analyst 说他就是这习惯,睡觉不关手机,也不接电话,等醒了会打回来。freemind 请我吃螃蟹,他说来到上海后,就开始喜欢吃这个东西了。还专门买了个蒸螃蟹的锅,周末从菜市场提上一串回家,放点冰糖一蒸,那可是人间美味。

吃完饭去他们办公室打星际。之后我们没交流太多技术问题,唯一印象深刻的一个就是谈这个加速器检测的方案。

这个方案从理论上看起来没错,但实际应用中,经常会发生误判。原因有二,一是准确对时非常困难 ,尤其在对时过程中 client 系统和通讯网络不稳定,会极大的影响后面的判定;第二是,PC 机的各钟主板,甚至运行的操作系统,都会导致时钟精度的不一致

所以在用时,这个方案还是有许多细节需要改进的。大话西游二的测试期间,不完善的检测手段,冤枉过不少可怜的玩家。kyo 的保守作风在这个问题上发挥了作用,原本我认为理论上完全可以判定出是否使用了加速器,但 kyo 一再坚持,即使检测到,也需要累积多次再做处理,这样大大减少了误判对玩家造成的影响。


2002 年的夏天,我基本脱离了《大话西游二》的开发。因为我总是自己找事情做,所以公司就没有指派给我任何任务。这期间读了几本书,影响了我好几年。

第一本书是著名的 C++ D&E :《C++语言的设计和演化》,我读了两遍,读的很快,但很透彻。这本书让我又一次重新认识了 C++ 。

第二本则是侯捷写的《STL 源码剖析》,我并没有读完。而是在实体书出版前, kyo 介绍我读了侯捷放出了前四章电子版。因为这本书,我把 STL 的源代码几乎浏览了一遍。发现 template 这个东西居然如此奇妙,从此陷入在把玩 template 的智力游戏中,一晃就是三年多。

02 年被我自己称为 C++ 年,C++ 的有关经典著作不断的被翻译,程序员杂志也在推波助澜。各大开发论坛的 C++ 版块都异常火爆。我在 csdn 注册了一个帐号,没发多少帖子,仅有的一些全在 C++ 版里了。我想我读了那几年翻译出版的所有的关于 C++ 的书,也为自己重新发现 C++ 这样一把无所不能的开发利刃而沾沾自喜。

ps. 通过 google 翻出当年的一个论战贴,讨论多重继承和组合模式的。我想很多同学在学习 C++ 时都有这类经历 :) 。

那些日子,不断的把自己学到的领悟到的新东西教给同事,我想,许多人都受到了感染。对于许多年轻的程序员,都会为找到一样可以证明自己比别人更聪明的玩具而兴奋不已。

在最为狂热时,我把 C++ 的字样印上了个人名片。和今天相比,当时的心境真是判若两人。

那段时间,我开始重新写 gui 的模块,想用“更 C++” 的方式来表达设计。编译期运算、(用 template)函数式编程、泛型抽象,无所不用之极。那套东西被我称之为 glow ( game library of windsoul) ,这名字还真是热情洋溢啊 :D 。

之后,便翻新重写“风魂”。不过鉴于 glow 开发时发现的一些问题,如编译速度过于迟缓、调试不便等,这个新版的“风魂”就不那么 C++ 了。也正庆幸这一点,这个版本可以一直用下去并被人持续维护,成为了后来《梦幻西游》以及其它几个网易产品的底层代码,甚至还用在了《天下二》的 GUI 模块中。

直到 2006 年,我开始对 C++ 开发项目进行反思。等到 2007 年写下 C 的回归 这篇颇有争议的 blog 时,我很能理解那些反对声音,如同理解当年的自己。


看到大话西游二顺利的发展,每天都能看到在线人数有新的突破,不多久就超过三万人在线了。我心里长舒了一口气,总算搞定了。

庞鑫离开后不久的一天,dingdang 把几个开发人员叫到了会议室。分别发给大家了一份文件。说是网易的期权。

所谓期权,就是一种在一段时间内,以一定价格买入指定股票的权利。这个价格往往就是制作期权文件那天的公开价位。虽然不是现金,但期权自有它的价值,这个在金融方面早有定论,不过当时我是没有太多概念。

简单的理解,就是当持有一支股票的期权,若它日后涨了,你可以以当初的价格买入。如果你在行使期权的当天再在公开市场上将股票卖出,其中的差价就是立刻能入手的获利了。而如果股价跌了,你可以放弃期权,也没有什么损失。在美国这样成熟的金融市场上,期权这种金融工具本身,甚至都可以被炒来炒去。

上市公司常常以颁发期权这种方式奖励员工,并鼓励员工努力工作,一同把公司发展的更好。一旦公司股价上涨,大家能有很大的收益。

直到 2004 年,网易每年都为所有正式员工颁发期权。无论是前台接待,还是仅入职几天的程序员,人人皆有。那一天,我手上的文件上写着 70 美分一股的价格,五年的有效期。等到 2006 年底即将过期时,我将这些期权全部行使,变成股票存放时,股价已经翻了一百多倍。

dingdang 向我解释说,本来我入职时间不长,可以拿到的数字比文件上的要少一些。但是由于一些同事的离开,大家商量后给我多一点。我所做的只需要签一个字了。

记得当时我很犹豫,迟迟不肯落笔。因为我觉得自己的事情都做完了,心里盘算着离开。


ps. 闲扯几句关于网易期权的事情吧。虽然公司里不让讨论大家各自期权多少和分配方案,但具体的情况,多少我还是有所耳闻的。当初那几年,我绝口不跟人谈这个,一是理解公司在这方面保密的苦心,二也是的确不太关心,否则也不至于每笔期权都到最后快过期的关头才着急行使,弄成每年都要做一次的大事。甚至感觉有些麻烦。

如今,公司已经不是人人发期权了,股价也涨到很高,我想再难有几十上百倍的收益。那些高收益的期权文件今天已经几乎都过了有效期限。有人在涨到 20 倍、30 倍时迫不及待的兑现,有人像我这样留到了最后,最终收益和当初期权数量反而关系不大。从金融角度看,当时的期权多少的差别其价值的绝对差距就不高。今天来谈这些,已经不太所谓了。

其实游戏部门的期权一开始总体不算多。这点我曾和其他部门一个头(已经离开网易)聊天时,他帮我打抱不平过。他说游戏部门为公司做出了很大的贡献,但在为自己部门谋福利这点上,dingdang 争取的太少。由于游戏部门人多,机构大,一平摊就没多少了。往往部门人一多,普遍级别就不高(官少),分期权的时候,级别又占了很大权重。他劝我去申请提一个级别,省得比别的部门干活少的多的人拿的还少。

利益分配真是个难题啊,共患难容易,共富贵难。

后来几年,让 dingdang 殚精竭虑的问题之一,就有如何奖励这个越来越大的团队中的每个成员。这绝不是一个写个程序,套个公式,就能完成的任务。它需要更多的智慧。


谢绝转载

那些日子(目录)

Comments

说实话, 你太自信了。 C的回归一文, 虽然我肯定比你嫩的多, 我很诚恳的说一句, 是你在认识上碰到局限性了。Template不是用来表示精巧构思的, 而只是用来表达概念的一个工具。 在这一点上, 即使stl和boost, 做的也不够好, 他们展示容易将人引向具体实现的误区。 掌握的再好再熟练, 而不知道如何应用到恰当的地方, 恰恰是值得警惕的。 当然, C能完成大多数工作, 尤其是在技巧性的能力达到一定水平, 问题是C不能很好的在代码内部进行和代码统一级别和统一的知识描述和基于知识描述的推理工作。 诚然我们可以自己编写工具进行这个工作, 但那就在代码之外了; 而我们明明可以有更好的方式的。
希望多讲点天下贰的故事。我是天下贰迷。从曾经美得让人掉泪的老天下贰,到现在遍地妖魔的新天下贰。
感觉写代码真的是很艺术的事情。。。
无论C++/C或者任何其他语言,只要能解决问题就行了,其实当一个人写代码的时候,什么语言都可以拿来就用,问题在于如果有人卷入你的代码的时候,就一定有人会JJYY的。
期待那些日子(十六)
感觉吧,天下贰回炉后即便重新出炉,人气不会像当初那样火了,比较惋惜。
丁很大方啊
对C++一知半解还反思? 难为你了。
hao !!!
中国版的《DOOM启世录》
呵呵,云风对技术细节记得总是那么清晰,那个检测加速器的方案是我之前在星河贝贝里实现的,可惜产品的失败让技术变得毫无意义,有效性没有在运营中得到验证。后来我再次遇到这个问题的时候,我找到了一种更简洁的解决方案,只要让客户端以固定的间隔向服务器发送Tick消息,服务器端就可以进行正确性验证,这可以比较好的避免对时和时间不准问题。
因为我总是自己找事情做,所以公司就没有指派给我任何任务。 ----------------------- 我觉得是公司对员工的一种肯定与信任。程序员天生有这样的责任感以及对编程的热爱,企业该如何给这样的环境及引导这种积极性形成生产力呢?
因为我总是自己找事情做,所以公司就没有指派给我任何任务。 ---------------------- 其实这个还是让我有些感触的
呵呵,似乎也有那种做完事了该走的感觉。每天两点多就看到有新的章节出来了,昨晚太累没看完就睡了,现在来补课。大语二完了,接下来是梦幻吗?
其实所谓的CoolDown 跟以前玩格斗游戏是完全一个道理的. 格斗游戏有所谓的叫硬直时间.都一个道理.不过格斗游戏中招式的出招,组合,还有不同的人物状态,更丰富, 更复杂.
有钱了才可以做自己喜欢做的事^^.
地震也要来看看云风
怀念大话二啊。
记得当时我很犹豫,迟迟不肯落笔。因为我觉得自己的事情都做完了,心里盘算着离开。 看到这一段真的很佩服云风的洒脱。真有古代侠客的风范啊!
在通讯底层加上时间戳这一方法其实还可以突破…… HOOK WINSOCK API应该可以搞定。 不过谈论这些没意义了~~
关注地震现在...实在要睡了,忽然发现云风更新了...就看完再睡吧..

Post a comment

非这个主题相关的留言请到:留言本