« 数值调整、模拟器、编辑器 | 返回首页 | 那些日子(九) »

那些日子(八)

今天工作上的事情弄的比较晚,没留出足够时间来继续写这个。本来打算直接回家睡觉的,想了想还是继续写点。凡事可以坚持做下去,往往靠的不是兴趣,不是责任,而是习惯。我不想让这些对过往的记录成为今天的负担,但也担心一旦放下就会拖上好久。反正腹稿都已经打好了,无论内容多少,还是保持着一天一更新的习惯吧。让我顺利把这件事情做完。


Dingdang 具体哪天加入的游戏开发组我已经记不清了。因为他做的是服务器那块,我不太关心。大约是在《大话西游》项目中后期吧,他说,服务器这边进度太慢,就过来了。他以前玩过 mud 挺有兴趣。但是其工作主要还是在底层。

大话的服务器最早是搭建在 mudOS 上的,一个开源的东东,用在各种文字 mud 上。做文字 mud 通常还会用一个中间层,叫做 mudlib 。早年传说中的方舟子一帮人等做《侠客行》,就是指做了一套 mudlib ,被后人用在各种中文文字 mud 上。听说大话的开发人员也自己做了套 mudlib (听说而已,micro 似乎跟我提过他们没用侠客行的代码,太久远的事情不想证实了),不过我对使用 mudOS 却不以为然。什么年代的东西啊,都 21 世纪了,还在用。也就那么点代码,就不能放弃掉自己写一个吗?而且原本为几十个人同时游戏设计的框架,用在这么多人同时在线的网游上合适么?

网易的同事们完全扔掉 mudOS 这根拐杖是到 大话3 的事情了。主要还是因为太多逻辑代码用 LPC (mudOS 内置的一种类 C 的脚本语言)实现。大家一点点的改造,先是将文本通讯协议改成对数据流量更节约一些的二进制方式,为特殊的需求添加一些代码(例如定时数据持久化),再做一些底层的优化,把 select 的网络模型改为 epoll ,等等。直到全部更替。这些工作持续了 4,5 年。

一开始,当然做不了这么许多。大家还是主要在完成游戏的进度。dingdang 坐我的旁边,中间靠走道的拐角处。桌子上没什么东西,上班时就带一个笔记本,在那里敲敲打打。

我对那段时间在工业园的记忆不多。因为每天,周围的人都是一个情景,闷头做事。晚上,走的晚的人倒不是很多,我和 dingdang 加班的次数比平均水平高一点。

他那个时候好象在热恋中,晚上经常窝在椅子上,捏着手机很小声音的讲电话,每次都很久很久。工业园的办公室晚上都是不开顶灯的,大家都很享受在黑暗里办公,显示器亮亮的,四处安静的很。

也偶有喧闹的时候,那是古越的 client 和 ten 以及 dingdang 联合调试。我没关心技术细节,只是从他们的对话中感觉有无数的 bug 改不完。有点忧虑,但无能为力。从一开始就没有参加到这块的逻辑中去,我只能好好做我那块东西。

记得当时 client 和 server 都有严重的内存泄露问题。client 这边我想了很多方法帮古越定位。server 那 dingdang 也在想办法。我们讨论过这个问题,渐渐的就谈到了内存管理器。dingdang 说他实现了一个 伙伴(Buddy)算法的内存分配器,主要是想减少一些内存碎片。自己写的内存管理器也可以有效的侦测到内存泄露的发源地。另外希望以合理的内存布局,让一些 bug 引起的内存越界访问时,减少服务器崩溃的几率。我在这方面是完美主义者,觉得根本就不应该允许 bug 的存在,但是 dingdang 显得很无奈。绕开这个有争议的话题,我们还谈了许多。只是现在都不记得了。


client 这边的分工倒是慢慢的很明确了。古越在配合服务器组实现 client 对应的逻辑。我来做底层,几乎不用搭理游戏是什么。比如大话西游那么丰富的场景和人物角色,开发期间只看过两三个,都是用来调试engine 用的。果子做了一部分跟图形无关的 client 底层,主要是网络包的分发处理。现在的眼光来看,设计的并不好,采用了多线程结构徒增了一些复杂度。如果追究原因的话,我想是因为当时我们 client 没有一个好的软件架构人员统筹安排,基本上都是各个人想怎么做就怎么做造成的。

UI 部分的呈现是郭斌负责,而跟 IE 接口的地方则是果子和另一个程序黄东海在做。说起后面这个人,也是游戏圈混迹多年的老人了。本来是做 3d engine 的,不知怎么就来到的网易。来之前我听过一些圈内的朋友说他脾气不是很好,比如老是敲着桌子抱怨美术没按他的思路去做。不过来到网易后可能没有啥担纲挑粱的工作,也见不出他的脾气。他只工作了一个月就离开了,那个月神龙见首不见尾,突然就出现在工位上,而后有几天见不着人。悄然辞职(或者就没正式入职)后又回家去做 3d ,几年后还有一面之缘,暂且不表了。

还有一块,是李鑫做的。那就是 client 外挂的聊天室。在时间紧张的日子,我拼命的找方法可以减少一些程序量。既然我们已经嵌了 IE ,那么就干脆做到底。这种实现方式在后面的产品里取消,但外挂聊天室的形式却保留了下来,成为网易游戏的一大特色。

网易当时的 web 聊天室做的不错,丁磊特别得意。记得他曾对他的朋友们吹嘘,我们的聊天室做的是中国技术最好的,一台机器可以支持 4000 人同时在线。这块东西是李鑫的作品,参照 IRC 协议实现的。client 部分用的 HTML ,server 用 C++ 完成。

李鑫在我刚进网易时就有人介绍给我认识。介绍人是 freemind ,我读大学时就认识的好朋友。多年的网友。我想 freemind 这个网名还会有许多人有印象吧 :) (前几天有读者来信说,让我怎么也要提一下 freemind ,说早年游戏圈里这么有名的人怎么能忽略掉。哈哈,我不会忘记这位老朋友的,有机会以后再写一次)他和李鑫曾是《电脑报》的同事,一起做过《电脑报》的多媒体光盘。在没有互联网的年代,那可是样好东西。

不知是什么缘分,我居然记得读过李鑫的聊天室源程序(是从一个开源的 IRC 服务器代码改的。那段时间,项目组其他人的代码都是没什么精力去看的)。印象比较深刻的是,他在许多地方的类接口传递的 CString 而不是 const CString & 。我们就此还讨论过一些 C++ 代码的性能问题。他表示是老代码一直拷贝用下来,没太在意。

项目就这样由许多人分头做着,一天天临近死亡线。


话说那段日子,还有另外一些事情。给我的记忆比开发大话要深刻许多。

北京的那帮哥们倒是做的有声有色起来。我离开北京后,他们也更改了一些计划。做手机游戏引擎的事情搁浅了,改为先做一些有特色的软件,几个游戏和一个 mp3 播放器。后者是安宁在优化,汇编是他的专长,有时电话里聊聊,他对他在好几款低端硬件上实现了 mp3 的流畅播放甚是满意。

Nokia 在广州开一个什么会议,庞鑫和安宁来到广州。我们少不了要聚一下。庞鑫给我看了他在 Nokia 9100 上做一个伪 3d 的模拟空战游戏,非常刺激。让我想起了天惑。据说游戏让 nokia 的家伙们看傻了眼,原来这机器机能这么强啊。嘿嘿,安宁跟我说,他们 hack 了 9100 的系统,用官方的 sdk 自然是做不出这效果来的。

丁磊说想请大家吃饭,让我先订了个房间,带大家先去坐着。主人没到,大家都不敢点菜。好在我们有的是话题聊。

这时候手机响了,我一看,是丁老大的。庞鑫在一旁嘟噜着,早着呢,那家伙刚出门。接起来,老丁在里面大声的说,“我已经出门了,马上就到”。又等了大约半小时,手机铃声再次响起。还没等我接呢,庞鑫再次插了一句,“他在停车呢,当大老板的就这样。”“你们再等等,我停好车就上来”,听到这句,大家都笑了。

这是 2001 年 7 月中旬的事情。不是我特地记下了这个日子,是因为第 2 天,我们在我家旁边的小山酒吧庆祝北京申奥成功。安宁喝了许多,我也是。大家特别的高兴,街上满是欢腾。2008 ,好遥远啊,等奥运真的在北京召开的那一天,大家会是怎样的境遇呢?

过了几个月,庞鑫和安宁来到了广州,还有徐创(逆火的另一创始人)。丁说,我们可以开始做 3d 游戏了。这是 天下 2 的开始。虽然那个项目的头几年,完全没有想到会重新以《天下》来命名,但我想庞鑫等的到来是网易开始在 3d 领域尝试的第一步。比官方记载的《天下贰》的开发历史早上许多。


谢绝转载

那些日子(目录)

Comments

01年我离开了编程这一行,进入了通信界。。。

const CString &和CString的问题,有时一个简单的拷贝就可以去掉一些讨厌的耦合,适当使用还是划算的。

刚看完8,这么晚了还有人也在看啊. 楼下的说你呢

呵呵,丁老大那段笑下。

几天没来,都写到8了,内容还没看,先赞一个.

“觉得根本就不应该允许 bug 的存在”,同感同感,可惜很多人没有那种体力把从头打造代码。

有意思

呵呵 留言里见到熟人

楼下的不要期待了, 估计这属于秘密,能透露的肯定不多. 但我觉得只有一个宗旨,性能上满足游戏的最低配置要求,功能上尽量满足各个开发人员,策划的要求.
貌似在说废话

云风,是否透露一些你现在正在做的项目的内容?是独立的引擎还是全新的网游,还是都是?引擎是3D的吗?网易已经购买了BigWorld引擎并用在了天下2中,为什么不使用你的引擎呢?既然买了BigWorld引擎并且修改了其大量代码来适合自己的网游那么你现在做的这款引擎项目还有意义吗?将来是否会应用到所有的网易游戏中吗?谢谢.

同意风舞影天

const Class & 等于是指针传递, 但必须保持有效的对象. 不能为NULL. 因此效率是很快的.

大家等丁老大那段好好笑啊

今天有dingdang的八卦了,嘿嘿~
每天上午守着看八卦。

const CString & 和cstring不是一样子迈?区别是啥子,我直接c语言的char*多好

区别大了,在每次调用接口时,前者会比后者少付出CString的构造与析构函数各一次的开销

先占个位置再看, 哈哈.

const CString & 和cstring不是一样子迈?区别是啥子,我直接c语言的char*多好

想起以前在sina游戏制作论坛混的日子,物是人非啊

老大的经历真有意思,呵呵。

你的关于内存数据压缩对我很有启发。我在做工业应用中的实时数据库。

Post a comment

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