« 那些日子(十七) | 返回首页 | 那些日子(十九) »

那些日子(十八)

大话二收费以后,因为我脱离了这个项目的开发组,也就没什么记忆了。不过也时常关心一下,记得十月刚回公司时,在游戏里的聊天频道中,经常有玩家哭述自己被骗。他们用游戏币和人交换点卡,却总有单方面失信的事情发生。

我们曾想过在玩家条款中加入禁止游戏虚拟物品和虚拟货币与现实货币交易的条款,正如暴雪今天在 wow 中做的那样。有一种直觉告诉我们,游戏牵扯进金钱交易,游戏本身会受到冲击,不是什么好事。

直觉不总是正确的。固然,我们可以利用程序规则限制虚拟物品的转移,但那也会极大的破坏游戏性。有如美国当年的禁酒令最终执行不下去一样,禁止不了的事情,不如提供更大的便利去疏通。开发团队决定给系统增加一个公正的点卡交易系统。

这个系统,在 02 年 10 月底一台服务器上试运行 。不久就在全部服务器推广开。我很赞同这个系统,但技术上没出什么力。讨论过程中,我只强调了一点,一定要在交易过程中征税,这个意见被顺利采纳了。

点卡交易系统一开始并不起眼,没人会想到它能起到多大价值。只是几个程序员看见玩家的需求,临时拍脑袋加上的。设计实现时也完全没考虑它会促进游戏的收益。开始时,有玩家传言,某些玩家寄售的点卡是由系统变出钱来凭空买下的。这种事情从未发生过,如果真的这么做了,其实也很容易被玩家发觉。其实,经过仔细考虑,我们也觉得没有必要这样去做。

玩家在这个系统的辅助下,游戏内的经济系统达到一个更为稳定的平衡状态。实际上促进了游戏的发展。金融工具可以促进经济的发展,点卡交易系统,就是一种在现实社会中不可能存在的金融工具,但对于网络游戏中的虚拟社会,则是非常有益的补充。

ps, 几年之后,我重新研究了这个问题。写过一篇 blog

慢慢的我也明白了,网络游戏和从前单机游戏之不同。网络游戏更为注重人和人之间的交流,更多的是在模拟一个社会。而社会的稳定和平衡是一个动态的过程,并非一开始设计好规则,就可以保证的。人的行为没有固定的模式,尤其是对比现实社会少的多的人群,规律更不确定。没有游戏规则是普适的。对规则的不断修改,增删,调整,就是一个动态调节的过程。后来我们的许多产品,包括许多同行发行的产品,没能经历这样一段调整期,也是最终没能成功的因素之一。


由于没有项目开发的压力,我的注意力主要放在了学习研究各种有趣的东西上。因为对 C++ 的热爱,那些日子大部分的精力都是围绕这方面。比如 boost ,阅读它的源码是主要的工作之一。

一开始看的是 boost.thread ,因为之前的多线程程序的复杂度印象太深刻了。我相信 C++ 可以带来一些方法来回避其复杂度。设计良好的线程库非常值得参考。当时和泡泡组黄晓东的后继者李鑫也有讨论,他们在项目中尝试用过 boost.thread 。我询问过他的意见,他说他们发现这个东西还不太稳定,有一些 bug 。现在无法确定当时泡泡那个版本遇到的问题是否真的有 boost.thread 的问题。但是,C++ 模板库不好调试,已经深深的影响了实际的开发。

从我们那个 C++ 邮件列表 02 年 10 月的信笺存档中,可以找到当时大家关心的许多话题。当时我还去看了 boost.python ,它是 boost 中不多见的几个需要编译才能使用的部件之一。为什么不是 boost.ruby 而是 boost.python ,引起了我的好奇心。看起来 C++ 社区对 python 真的是特别有爱啊。这引起我对 python 语言的关注。

boost.python 挺有趣,不仅仅是它做到的事情,也包括它怎样做到这些。比如它给指针分类,让 python 可以正确的处理 C++ 的对象生命期,用以避免 dangling pointer 。

boost.python 相当活跃,就在我把玩它的那几天,就经过一次翻天覆地的变动,把接口全改了。

那几天,孟岩曾在北京采访过 C++ 之父 Stroustrup 。回来在 C++ 邮件列表里投了一帖。其中也提到 python :

“他(Stroustrup)说 Python 很有趣,不过说 Python 是 C++ 的最佳搭档言过其实,因为 C++ 一直都是很多种语言的最佳排挡。关键不在于那种语言多么的出色,而在于你应该选择最合适的工具解决问题。而 C++ 很少被用来构造整个系统,通常只构造系统中的关键部分,这时候,他当然鼓励把其他语言与 C++ 共同使用,而且实际上,一直以来都是这样。”

另外值得一提的是 Stroustrup 的其他一些观点,例如对于 boost 和 loki ,他毫不犹豫地赞同我们这个圈子当时许多人的观点,“某些库中有过分运用模板机制的倾向”。并强调,“ C++ 是一种多范式语言,最好的风格是综合运用各种范式,保持平衡,求得对某个特定问题的最佳解决方案。过分运用泛型程序设计技术,与过分运用面向对象技术一样,都是他不赞成的。”

还有关于指针的问题,“他(Stroustrup)通常把实际对象也放到容器里,然后再用一个容纳指针的容器 进行关键操作。他认为只要你仔细考虑,大多数资源都是有一个唯一的 owner 的。接着,他主动谈到智能指针,最有趣的东西就在这里了,他说,有很多人开发了类似 shared ptr 这样的东西,使事情看上去很漂亮。但是他不太喜欢智能指针。这个东西实际上是一种半吊子 GC ,它比手工管理自动化,又不如 GC自动化,高不成低不就。你同样不知道对象是什么时候被析构的,那为什么不直接用GC呢?在他看来,普通指针仍然有很大用处,不应该试图绕开它。”


当时,我们也关注一些诸如敏捷编程的时髦话题。孟岩曾经(02 年 10 月 24 日)转过一封 Bob 大叔 Robert Martin 给他的信,里面有一段话无关敏捷编程,但我觉得挺有趣,

It has been quite awhile since I have done any serious C++ work. Most of my work now is in Java, and is transitioning to C#. I'm not thrilled with either of these languages. They are OK, but not great. The languages that most pique my interest at the moment are Python and Ruby. I think the future likes in that direction.

是时候好好看看 python 了,不知不觉的公司里许多程序员中都开始出现学习 python 的势头。我第一次认真的审视这些动态语言,而不仅仅把它们当作一种嵌入式脚本使用。


叶航是在 02 年 10 月来公司报道的。以前我更熟悉他的网名:高铃响。我们在 sina 游戏制作论坛泡了好些年,是多年未见过面的网友。只听说他在深圳万智源做最初幻想,然后就被 dingdang 叫到了网易来。也有人叫他老高,不过我更多还是只呼其名了。

那天,我在天河跟 sina 论坛的坛友龙云峰喝酒。听说叶航过来了,打了个电话把他叫过去,大家版聚一下。就在一个很小的酒吧,为他接风。他是个好青年,时不时的接一下女朋友的电话。我们聊一些论坛上的旧事。叶航和我同届,真是奇怪的很,我认识的许多做游戏的同行,居然都是 2000 年大学毕业的,

叶航入职后进了大话组,不知道忙着什么。离他正式转入天下组做策划,随后升为主策划还有半年时间。不过我想 dingdang 早就想好了让他负责天下的吧。


大话一的玩家流失的很快,到了 03 年时,据说有的服务器上最少的时候只有两三个人,其中还有一个是在线的 GM 。不得不佩服这样忠实的玩家,即使把一个网络游戏玩成单机版,也要坚持下去。

徐波在那里摆弄大话一的新版本“仙履奇缘”,成天在论坛里跟玩家吵吵闹闹。同时, 大部分的大话一玩家被分流到这个使用大话二的新 client 以及从大话二服务器分支出来开发的服务器系统。这个服务器免费,聚集着上千个前大话一的玩家。我想那是一块实验田,可以不断的尝试加一些新的东西,对规则不断的修正,补充一些细节。我想,我们到现在为止,再没有一个项目可以这样。有稳定的程序,稳定且有一定数量的用户,没有项目时间的安排,只是不断的修改游戏设计,让它更好玩。

丁丁去而复返,dingdang 安排他做徐波的上司,在这个分不清是旧瓶装新酒还是新瓶装旧酒的项目里做主策划。作为外人,我对项目策划方面的进展了解不多,无法判断到底是丁丁的贡献更大,还是徐波的。但是我能肯定,不能否定他们任何一人为这个游戏,日后被称为《梦幻西游》的游戏,初期所做的一切。


03 年初,lua 第 5 版即将发布的消息从 lua 的邮件列表中传出。我饶有兴趣的查看了新特性列表,被深深吸引的是新加入的 coroutine 。直觉告诉我,这是一种用来描述游戏逻辑不错的工具。

coroutine 其实就是协作式多线程。在 windows 3.1 的年代就被用于多任务系统的开发。现在的 windows 也支持一个叫作 fiber 的特性。我想,其实用 C 语言也可以轻易模拟出这样的东西来。

之前,大话二的 client 一直在用类似状态机的方式控制屏幕上的角色。虽然 kyo dingdang 都觉得这样就够了,因为已经比大话一做的好。但是我始终不太满意。我想找到更自然的方法去描述画面行为。只有这样,程序员才好放手去描述更多的细节,游戏才能表现的更生动。

我花了许多时间来写一个 C 的 coroutine 库。事后发现完全可以用标准 C 语言(借助 longjmp) 来实现,但是当时还是采用了汇编。这样我能更精确的控制内存的布局(尤其是堆栈方面的处理),因为按我的想法,为每个控制序列附加一个线程控制,可能会达到千个这样的数量级。不仔细推敲是不行的。

郭老对这个东西很感兴趣,我给他演示了一些简单的例子,他觉得用起来很方便。

大约在 03 年的春天,郭老对我说,我这里风魂已经用 C++ 再次重写过了。我们这半年又弄出了许多好玩的东西,例如那个 coroutine 。不如大家用新的代码重新写一个游戏 client 吧。这次我用 coroutine 实现了新的网络底层接口,声音模块,还有对象的管理。一切都感觉比上次做大话二时舒服多了。

还有 python ,大家那时都认定它比 lua 更好用。

掌握了新的技术,总是能激发程序员们的斗志。就这样,我们再次开始从头开始写西游的客户端程序。目标是让《梦幻西游》可以用上新的技术。哦,那个时候还不叫《梦幻西游》,但不久就会换上这个留在无数玩家心里的名字了。

《梦幻西游》就这样兵分几路,独立的开发着。策划用着大话二的程序系统测试着玩法,并由服务器程序跟进。美术按照留下来的规范制作着新的资源,当然,我们的工具慢慢的也齐备了。我为之制作了可视化的编辑器,郭老做了一个魔法效果的编辑器。因为我们讨论的结果是,既然有时间,应该进一步的压缩 client 需要的美术资源,以后当以程序控制的动画为主。还有诸如更换武器,局部换色等等方案,都在有条不紊的制定出来。

而 Client 程序方面,由郭老和我一起制作。我还是写底层,除了重写了所有的 engine 代码外。还新增加了不少特性。比如图象动态缩放,这 RLE 压缩图片的实时缩放写起来相当麻烦,虽然最后我把它实现了,但因为换装拼接时,出现一些接缝问题效果不太满意,最终放弃未用。这会是名副其实的并肩作战,大家在发现潜在的问题时都可以当天解决。新的 client 质量得以提升就是理所当然的事了。

梦幻西游这个项目,悄然开始,顺利展开,正在于这种相互独立的开发。这个优势,在大话西游二的研发期间已经显露出来,但到梦幻西游,发挥的淋漓尽致。


大话二的收入不错,慢慢的大家的口袋里都富裕了起来。我不知道公司具体给开发组的提成是多少。从往日的一封邮件来模糊的揣测,应该不到 8% 。但是,这个游戏的收入总量是巨大的,而我们也没有投入太多的研发经费。连宣传都是少之又少。最终,大家拿到手的奖金自然是非常丰厚。这给了所有人一个非常宽松的开发环境。

没有多久,我们每个人都领到了一件纪念 T 恤,上面印了,十万人在线的大话西游。


如果要说点别的,在 02 年底,我突然爱上了 ps2 上的游戏。从最终幻想 X 开始。公司里有两台 ps2 ,就放在办公区的一角。每天下班后,大家都去玩一玩。一天,我看见麻雀在那玩最终幻想,这是个老游戏,但英文版出来不久。我帮他做翻译,一边看着他玩。然后自己就开始手痒了。由于不好霸占着公共的游戏机资源。周末立刻去买了一台回家。

之后一发不可收拾。我想我购买了几乎所有发行过的 ps2 游戏,数以千计。和许多游戏收藏爱好者不同,有一年的时间,我都是很认真的玩每个不那么垃圾的游戏。很多很多游戏都从头打到尾了。

那几年的业余生活很简单,健身,打游戏。当然后来还有更多的一些活动,比如骑车、攀岩、看卡通,这么看的话,不算宅男,嘿嘿。


谢绝转载

那些日子(目录)

Comments

看了您的行事风格,真是像一位武侠小说中的侠客。交友很广,认识行业朋友好多啊。

最终幻想X是超级经典,我玩穿以后立马买了一张正版(国际版)不买对不起那些呕心沥血做游戏的人啊。不过到现在还没有找完七耀之武器。。。。我还是太懒了 。

怎么能查到云风blog的访问量啊,我看如果继续这样写下去,比网络连载小说都要火,推荐每个程序员必读!

宅,宅一点有什么不好;)

高铃响的BLOG也好火啊 老天下2流产之后--!

看到最后一段,忍不住笑着留个言

哈哈, 宅就宅呗, 宅男挺好的不是吗

宅不在于打游戏看卡通,而在于窝在家里不出门。

偶好歹也是个玩户外运动的 :D

所以规划自己的时间才是最重要的。

最后搞笑了哈,那么多游戏,很多还从头打到尾,还看卡通,还不算宅男啊

现在梦幻上除了人民币玩家就是职业代练和梦幻币工作室。普通玩家深受压榨,已经进入衰退期

抵触情绪转变为存在即合理,需要了解。

支持感悟!

是数以千计的盗版吧?

貌似正版PS2盘都几百一块。

也可以算是宅了啊。。。

板凳可以不占, 沙发是要占的.
小睡了一个觉起来, 就有得看了, 边吃方便面边看, 哈哈

Post a comment

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